{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/sohaibaiwaaz/ECG_biometric_authentication/blob/main/DL_CourseProject_Teamno6_ipynb.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "DOUMvcShTpVc"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import tensorflow as tf\n",
        "from tensorflow.keras.models import Sequential\n",
        "from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, BatchNormalization\n",
        "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
        "from tensorflow.keras.applications import VGG16, VGG19\n",
        "from tensorflow.keras.models import Model\n",
        "from tensorflow.keras.optimizers import Adam"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "6NlGp7eIWitb",
        "outputId": "816b4618-1531-4a52-8f62-75bb63504b77"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
          ]
        }
      ],
      "source": [
        "from google.colab import drive\n",
        "drive.mount('/content/drive')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "id": "zHB_-HS2WlOo"
      },
      "outputs": [],
      "source": [
        "import os\n",
        "import zipfile\n",
        "\n",
        "# Path to the zip file\n",
        "zip_path = '/ECG-Dataset.zip'\n",
        "\n",
        "# Path to extract the zip file to (can be the same directory or a different one)\n",
        "extract_path = '/extracted_dataset'\n",
        "\n",
        "# Extract the zip file\n",
        "with zipfile.ZipFile(zip_path, 'r') as zip_ref:\n",
        "    zip_ref.extractall(extract_path)\n",
        "\n",
        "    # Update the data_path to the extracted folder\n",
        "    data_path = extract_path\n",
        "\n",
        "    # Now you can list the contents of the extracted folder\n",
        "    os.listdir(data_path)\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "id": "yJL09htlXg8N"
      },
      "outputs": [],
      "source": [
        "# Define constants\n",
        "#data_path = '/content/drive/MyDrive/unzipped_dataset/filter40'\n",
        "input_shape = (224, 224, 3)  # Resize images to 299x299 for InceptionV3\n",
        "photo_size = 224"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "id": "oMvWJWd_X0Gj"
      },
      "outputs": [],
      "source": [
        "# Setup ImageDataGenerator with rescaling and data augmentation\n",
        "datagen = ImageDataGenerator(\n",
        "    rescale=1./255,  # Rescale pixel values to [0, 1]\n",
        "    validation_split=0.2  # Split data into training (80%) and validation (20%)\n",
        ")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ORIJHe7IX2Ix",
        "outputId": "76e07653-a65e-4ef1-fa74-ae48f5c0d497"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Found 960 images belonging to 1 classes.\n"
          ]
        }
      ],
      "source": [
        "# Load and prepare training data\n",
        "train_generator = datagen.flow_from_directory(\n",
        "    data_path,\n",
        "    target_size=(input_shape[0], input_shape[1]),\n",
        "    batch_size=32,\n",
        "    class_mode='categorical',\n",
        "    subset='training',\n",
        "    shuffle=True,\n",
        "    seed=42\n",
        ")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "mNwUaeCbYB9u",
        "outputId": "009ac85d-f812-42a3-9406-589b8206f764"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Found 240 images belonging to 1 classes.\n"
          ]
        }
      ],
      "source": [
        "# Load and prepare validation data\n",
        "validation_generator = datagen.flow_from_directory(\n",
        "    data_path,\n",
        "    target_size=(input_shape[0], input_shape[1]),\n",
        "    batch_size=32,\n",
        "    class_mode='categorical',\n",
        "    subset='validation',\n",
        "    shuffle=False,\n",
        "    seed=42\n",
        ")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {
        "id": "S_mOCescYE4L"
      },
      "outputs": [],
      "source": [
        "# Create the VGG16 model\n",
        "def create_vgg_model():\n",
        "    # Load VGG16 model without the top classifier layers\n",
        "    base_model = VGG16(include_top=False, input_shape=(photo_size, photo_size, 3))\n",
        "\n",
        "    # Freeze all layers except specific layers (example: layers 1-3 and 15-18)\n",
        "    for layer_idx in range(len(base_model.layers)):\n",
        "        if layer_idx not in [1, 2, 3, 15, 16, 17, 18]:\n",
        "            base_model.layers[layer_idx].trainable = False\n",
        "\n",
        "    # Add new classifier layers\n",
        "    flat1 = Flatten()(base_model.output)\n",
        "    dense1 = Dense(4096, activation='relu')(flat1)\n",
        "    drop1 = Dropout(0.5)(dense1)\n",
        "    dense2 = Dense(4096, activation='relu')(drop1)\n",
        "    drop2 = Dropout(0.5)(dense2)\n",
        "    dense3 = Dense(2048, activation='relu')(drop2)  # Additional layer\n",
        "    drop3 = Dropout(0.5)(dense3)  # Additional layer\n",
        "    output = Dense(train_generator.num_classes, activation='softmax')(drop3)\n",
        "\n",
        "    # Define new model\n",
        "    model = Model(inputs=base_model.inputs, outputs=output)\n",
        "    return model\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "id": "CV84IIgkYI1J",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "outputId": "ece504a9-dc44-45cd-a771-1196f80cb266"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5\n",
            "\u001b[1m58889256/58889256\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 0us/step\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "\u001b[1mModel: \"functional\"\u001b[0m\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"functional\"</span>\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
              "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
              "│ input_layer (\u001b[38;5;33mInputLayer\u001b[0m)        │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m3\u001b[0m)    │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block1_conv1 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m64\u001b[0m)   │         \u001b[38;5;34m1,792\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block1_conv2 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m64\u001b[0m)   │        \u001b[38;5;34m36,928\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block1_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m64\u001b[0m)   │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block2_conv1 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │        \u001b[38;5;34m73,856\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block2_conv2 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │       \u001b[38;5;34m147,584\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block2_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m128\u001b[0m)    │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block3_conv1 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m256\u001b[0m)    │       \u001b[38;5;34m295,168\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block3_conv2 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m256\u001b[0m)    │       \u001b[38;5;34m590,080\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block3_conv3 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m256\u001b[0m)    │       \u001b[38;5;34m590,080\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block3_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m256\u001b[0m)    │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block4_conv1 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m512\u001b[0m)    │     \u001b[38;5;34m1,180,160\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block4_conv2 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m512\u001b[0m)    │     \u001b[38;5;34m2,359,808\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block4_conv3 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m512\u001b[0m)    │     \u001b[38;5;34m2,359,808\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block4_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m512\u001b[0m)    │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block5_conv1 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m512\u001b[0m)    │     \u001b[38;5;34m2,359,808\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block5_conv2 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m512\u001b[0m)    │     \u001b[38;5;34m2,359,808\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block5_conv3 (\u001b[38;5;33mConv2D\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m512\u001b[0m)    │     \u001b[38;5;34m2,359,808\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block5_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m512\u001b[0m)      │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ flatten (\u001b[38;5;33mFlatten\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m25088\u001b[0m)          │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense (\u001b[38;5;33mDense\u001b[0m)                   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4096\u001b[0m)           │   \u001b[38;5;34m102,764,544\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout (\u001b[38;5;33mDropout\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4096\u001b[0m)           │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_1 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4096\u001b[0m)           │    \u001b[38;5;34m16,781,312\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m)             │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4096\u001b[0m)           │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_2 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2048\u001b[0m)           │     \u001b[38;5;34m8,390,656\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout_2 (\u001b[38;5;33mDropout\u001b[0m)             │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2048\u001b[0m)           │             \u001b[38;5;34m0\u001b[0m │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_3 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m)              │         \u001b[38;5;34m2,049\u001b[0m │\n",
              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
              "┃<span style=\"font-weight: bold\"> Layer (type)                    </span>┃<span style=\"font-weight: bold\"> Output Shape           </span>┃<span style=\"font-weight: bold\">       Param # </span>┃\n",
              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
              "│ input_layer (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>)        │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">224</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">224</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">3</span>)    │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block1_conv1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">224</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">224</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)   │         <span style=\"color: #00af00; text-decoration-color: #00af00\">1,792</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block1_conv2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">224</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">224</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)   │        <span style=\"color: #00af00; text-decoration-color: #00af00\">36,928</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block1_pool (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">112</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">112</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)   │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block2_conv1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">112</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">112</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │        <span style=\"color: #00af00; text-decoration-color: #00af00\">73,856</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block2_conv2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">112</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">112</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │       <span style=\"color: #00af00; text-decoration-color: #00af00\">147,584</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block2_pool (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">56</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">56</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)    │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block3_conv1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">56</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">56</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>)    │       <span style=\"color: #00af00; text-decoration-color: #00af00\">295,168</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block3_conv2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">56</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">56</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>)    │       <span style=\"color: #00af00; text-decoration-color: #00af00\">590,080</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block3_conv3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">56</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">56</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>)    │       <span style=\"color: #00af00; text-decoration-color: #00af00\">590,080</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block3_pool (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>)    │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block4_conv1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>)    │     <span style=\"color: #00af00; text-decoration-color: #00af00\">1,180,160</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block4_conv2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>)    │     <span style=\"color: #00af00; text-decoration-color: #00af00\">2,359,808</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block4_conv3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>)    │     <span style=\"color: #00af00; text-decoration-color: #00af00\">2,359,808</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block4_pool (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">14</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">14</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>)    │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block5_conv1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">14</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">14</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>)    │     <span style=\"color: #00af00; text-decoration-color: #00af00\">2,359,808</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block5_conv2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">14</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">14</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>)    │     <span style=\"color: #00af00; text-decoration-color: #00af00\">2,359,808</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block5_conv3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">14</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">14</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>)    │     <span style=\"color: #00af00; text-decoration-color: #00af00\">2,359,808</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ block5_pool (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">7</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">7</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>)      │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>)               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">25088</span>)          │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4096</span>)           │   <span style=\"color: #00af00; text-decoration-color: #00af00\">102,764,544</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>)               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4096</span>)           │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4096</span>)           │    <span style=\"color: #00af00; text-decoration-color: #00af00\">16,781,312</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>)             │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4096</span>)           │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2048</span>)           │     <span style=\"color: #00af00; text-decoration-color: #00af00\">8,390,656</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>)             │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2048</span>)           │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>)              │         <span style=\"color: #00af00; text-decoration-color: #00af00\">2,049</span> │\n",
              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m142,653,249\u001b[0m (544.18 MB)\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">142,653,249</span> (544.18 MB)\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m135,056,705\u001b[0m (515.20 MB)\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">135,056,705</span> (515.20 MB)\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m7,596,544\u001b[0m (28.98 MB)\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">7,596,544</span> (28.98 MB)\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        }
      ],
      "source": [
        "# Instantiate and compile the VGG19 model\n",
        "vgg_model = create_vgg_model()\n",
        "vgg_model.summary()\n",
        "vgg_model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {
        "id": "vwb5dVWoYOE2",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "687a6df2-6d49-434c-df43-414c8f07aaf3"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.11/dist-packages/keras/src/trainers/data_adapters/py_dataset_adapter.py:121: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.\n",
            "  self._warn_if_super_not_called()\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/20\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.11/dist-packages/keras/src/models/functional.py:237: UserWarning: The structure of `inputs` doesn't match the expected structure.\n",
            "Expected: ['keras_tensor']\n",
            "Received: inputs=Tensor(shape=(None, 224, 224, 3))\n",
            "  warnings.warn(msg)\n",
            "/usr/local/lib/python3.11/dist-packages/keras/src/ops/nn.py:907: UserWarning: You are using a softmax over axis -1 of a tensor of shape (None, 1). This axis has size 1. The softmax operation will always return the value 1, which is likely not what you intended. Did you mean to use a sigmoid instead?\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.11/dist-packages/keras/src/losses/losses.py:33: SyntaxWarning: In loss categorical_crossentropy, expected y_pred.shape to be (batch_size, num_classes) with num_classes > 1. Received: y_pred.shape=(None, 1). Consider using 'binary_crossentropy' if you only have 2 classes.\n",
            "  return self.fn(y_true, y_pred, **self._fn_kwargs)\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m60s\u001b[0m 1s/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 2/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 406ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 3/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m12s\u001b[0m 408ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 4/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m12s\u001b[0m 409ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 5/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m12s\u001b[0m 414ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 6/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 416ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 7/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 419ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 8/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 461ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 9/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 464ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 10/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 424ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 11/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 426ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 12/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 429ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 13/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 474ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 14/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 444ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 15/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 455ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 16/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 453ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 17/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 444ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 18/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 481ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 19/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 439ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n",
            "Epoch 20/20\n",
            "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 446ms/step - accuracy: 1.0000 - loss: 0.0000e+00 - val_accuracy: 1.0000 - val_loss: 0.0000e+00\n"
          ]
        }
      ],
      "source": [
        "# Train the model and capture the history\n",
        "history = vgg_model.fit(\n",
        "    train_generator,\n",
        "    epochs=20,\n",
        "    validation_data=validation_generator\n",
        ")\n"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "#Save the model\n",
        "\n",
        "model_save_path = '/content/drive/MyDrive/model.h5'\n",
        "\n",
        "# Save the model\n",
        "vgg_model.save(model_save_path)\n",
        "\n",
        "print(\"Model saved to disk.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "fdWbEzfLypuh",
        "outputId": "fd6424b8-2dbc-4bea-daef-a60ff96aee4d"
      },
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Model saved to disk.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "metadata": {
        "id": "PBNnmADGYQlB",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 472
        },
        "outputId": "2fd1d6e4-c50b-4763-cecf-1817a5157151"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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brdLkp544gnFxcXl2+fOO+90acxp06Zp4sSJ6t+/v1588UVVqVJFXl5eGjFihGN/7lTQSpDNZitwm9+v9uTq3r27vv/+e/31r39VkyZNVLFiRdntdrVv3/6G6u7Tp48WL16s77//Xo0bN9ZXX32lZ5991rE6BpgdAQiAunbtqqefflqbNm3SwoULC+xXq1YtrVq1SpmZmU6rQPv373e8nvu/drvdscqS68CBA07j5V4hZrPZ1K5dO7fM5fPPP1fbtm314YcfOrVfuHBB1apVczyvW7euNm/erJycHPn4+OQ7Vt26dbVy5UqdP3++wFWgypUrO8b/vdzVsOvx3//+V0lJSZoyZYpeeOEFR/vBgwed+gUHByswMFB79uy55pjt27dXcHCw5s6dq+joaF26dElPPvnkddcElHX8pwAAVaxYUbNnz9bkyZMVGxtbYL+OHTvKZrNp5syZTu1vvfWWLBaL40qy3P/941VkM2bMcHru7e2tbt266Ysvvsj3j/rZs2ddnou3t3eeS/IXL16sU6dOObV169ZN586dyzMXSY7tu3XrJsMwNGXKlAL7BAYGqlq1alq3bp3T6++9955LNf9+zFx//H15eXmpS5cu+r//+z/HZfj51SRJ5cqVU69evbRo0SIlJCSocePGLq+mAWUZK0AAJKnAj6B+LzY2Vm3bttX48eP1888/KyoqSv/5z3/073//WyNGjHCc89OkSRP16tVL7733ntLT09W6dWslJSXp0KFDecZ8+eWXtWbNGkVHR+upp57S7bffrvPnz2v79u1atWqVzp8/79I8HnroIU2dOlX9+vVT69attXv3bs2dO1d16tRx6tenTx998sknGjVqlLZs2aI///nPysrK0qpVq/Tss8+qc+fOatu2rZ588km98847OnjwoOPjqO+++05t27bVkCFDJP12yf/LL7+sgQMHqnnz5lq3bp1++umn6645MDBQ99xzj1599VXl5OSoRo0a+s9//qOjR4/m6Ttt2jT95z//0b333qtBgwapYcOGOnPmjBYvXqz169c7fXzZp08fvfPOO1qzZo1eeeUVl36PQJnnsevPAHjM7y+DL8wfL4M3DMPIzMw0Ro4caYSHhxs+Pj5GvXr1jNdee81xCXauy5cvG8OGDTOqVq1qVKhQwYiNjTVOnDiR59JwwzCM1NRUIz4+3oiIiDB8fHyM0NBQ4/777zc++OADRx9XLoN/7rnnjLCwMMPPz89o06aNsXHjRuPee+817r33Xqe+ly5dMsaPH29ERkY69vvoo48ahw8fdvT59ddfjddee81o0KCBUb58eSM4ONjo0KGDsW3bNqdxBgwYYAQFBRkBAQFG9+7djbS0tAIvgz979myeuk+ePGl07drVqFSpkhEUFGQ89thjxunTp/P9fR07dszo06ePERwcbFitVqNOnTpGfHy8kZ2dnWfcRo0aGV5eXsbJkycL/b0BZmMxjD+suQIAyoy77rpLVapUUVJSkqdLAUoUzgECgDLqhx9+UHJysvr06ePpUoAShxUgAChj9uzZo23btumNN97QuXPndOTIEfn6+nq6LKBEYQUIAMqYzz//XP369VNOTo7mz59P+AHywQoQAAAwHVaAAACA6RCAAACA6fBFiPmw2+06ffq0AgICbuqOzwAAoPgYhqHMzEyFh4df8753BKB8nD59WhEREZ4uAwAA3IATJ06oZs2ahfYhAOUj9yaPJ06cUGBgoIerAQAA1yMjI0MRERFON2suCAEoH7kfewUGBhKAAAAoZa7n9BVOggYAAKZDAAIAAKZDAAIAAKbDOUA3wWazKScnx9NlwA18fHzk7e3t6TIAAMWEAHQDDMNQSkqKLly44OlS4EaVKlVSaGgo3/0EACZAALoBueGnevXq8vf35w9mKWcYhi5duqS0tDRJUlhYmIcrAgAUNQKQi2w2myP8VK1a1dPlwE38/PwkSWlpaapevTofhwFAGcdJ0C7KPefH39/fw5XA3XKPKed1AUDZRwC6QXzsVfZwTAHAPAhAAADAdAhAuCm1a9fWjBkzPF0GAAAuIQCZhMViKfQxefLkGxp369atGjRokHuLBQCgiHEVmEmcOXPG8fPChQv1wgsv6MCBA462ihUrOn42DEM2m03lyl37n0dwcLB7CwUAoBiwAmQSoaGhjkdQUJAsFovj+f79+xUQEKDly5erWbNmslqtWr9+vQ4fPqzOnTsrJCREFStWVIsWLbRq1Sqncf/4EZjFYtG//vUvde3aVf7+/qpXr56++uqrYp4tAACFIwC5gWEYunT112J/GIbh1nmMHTtWL7/8svbt26c777xTFy9eVMeOHZWUlKQdO3aoffv2io2N1fHjxwsdZ8qUKerevbt27dqljh07qnfv3jp//rxbawUA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wzAMTxdR0mRkZCgoKEjp6ekKDAx0eu3KlSs6evSoIiMj5evr66EKURQ4tgBQuhX29/uPPLoCtG7dOsXGxio8PPy67/W0du1aNW3aVFarVbfeemueL/b7vZdfflkWiyXf76MBAADm5dEAlJWVpaioKM2aNeu6+h89elSdOnVS27ZtlZycrBEjRmjgwIFauXJlnr5bt27V+++/7/LtHQAAQNnn0avAOnTo4NINLv/xj38oMjLScdl0w4YNtX79er311luKiYlx9Lt48aJ69+6tf/7zn/r73//u9roBAEDpVqpOgt64caPatWvn1BYTE6ONGzc6tcXHx6tTp055+gIAAEil7HuAUlJS8lzmHBISooyMDF2+fFl+fn5asGCBtm/frq1bt173uNnZ2U6XW2dkZFxzG84dL3s4pgBgHqVqBehaTpw4oeHDh2vu3LkuXcUzffp0BQUFOR4REREF9s39duFLlzxw81MUqdxj+sdvkAYAlD2lagUoNDQ0z5fzpaamKjAwUH5+ftq2bZvS0tLUtGlTx+s2m03r1q3TzJkzlZ2d7XRvqFzjxo3TqFGjHM8zMjIKDEHe3t6qVKmS455S/v7+jjuro3QyDEOXLl1SWlqaKlWqlO+/EQBA2VKqAlCrVq30zTffOLUlJiY6brp5//33a/fu3U6v9+vXTw0aNNCYMWMK/MNmtVpltVqvu47cO5VzY82ypVKlSoXehR4AUHZ4NABdvHhRhw4dcjzPvQVClSpVdMstt2jcuHE6deqUPvnkE0nS4MGDNXPmTD3//PPq37+/Vq9erUWLFmnZsmWSpICAAN1xxx1O+6hQoYKqVq2ap/1mWCwWhYWFqXr16srJyXHbuPAcHx8fVn4AwEQ8GoB++OEHtW3b1vE892OouLg4JSQk6MyZMzp+/Ljj9cjISC1btkwjR47U22+/rZo1a+pf//qX0yXwxcnb25s/mgAAlELcCiMfrnyVNgAAKBlKza0wAAAAPIEABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATMejAWjdunWKjY1VeHi4LBaLli5des1t1q5dq6ZNm8pqterWW29VQkKC0+vTp09XixYtFBAQoOrVq6tLly46cOBA0UwAAACUSh4NQFlZWYqKitKsWbOuq//Ro0fVqVMntW3bVsnJyRoxYoQGDhyolStXOvp8++23io+P16ZNm5SYmKicnBw9+OCDysrKKqppAACAUsZiGIbh6SIkyWKxaMmSJerSpUuBfcaMGaNly5Zpz549jraePXvqwoULWrFiRb7bnD17VtWrV9e3336re+6557pqycjIUFBQkNLT0xUYGOjSPAAAgGe48ve7VJ0DtHHjRrVr186pLSYmRhs3bixwm/T0dElSlSpVirQ2AABQepTzdAGuSElJUUhIiFNbSEiIMjIydPnyZfn5+Tm9ZrfbNWLECLVp00Z33HFHgeNmZ2crOzvb8TwjI8O9hQMAgBKlVK0AuSo+Pl579uzRggULCu03ffp0BQUFOR4RERHFVCEAAPCEUhWAQkNDlZqa6tSWmpqqwMDAPKs/Q4YM0ddff601a9aoZs2ahY47btw4paenOx4nTpxwe+0AAKDkKFUfgbVq1UrffPONU1tiYqJatWrleG4YhoYOHaolS5Zo7dq1ioyMvOa4VqtVVqvV7fUCAICSyaMrQBcvXlRycrKSk5Ml/XaZe3Jyso4fPy7pt5WZPn36OPoPHjxYR44c0fPPP6/9+/frvffe06JFizRy5EhHn/j4eH322WeaN2+eAgIClJKSopSUFF2+fLlY5wYAAEouj14Gv3btWrVt2zZPe1xcnBISEtS3b1/9/PPPWrt2rdM2I0eO1N69e1WzZk1NnDhRffv2dbxusVjy3decOXOc+hWGy+ABACh9XPn7XWK+B6gkIQABAFD6lNnvAQIAAHAHAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdlwNQ7dq1NXXqVB0/frwo6gEAAChyLgegESNG6Msvv1SdOnX0wAMPaMGCBcrOzi6K2gAAAIrEDQWg5ORkbdmyRQ0bNtTQoUMVFhamIUOGaPv27UVRIwAAgFtZDMMwbmaAnJwcvffeexozZoxycnLUuHFjDRs2TP369ZPFYnFXncUqIyNDQUFBSk9PV2BgoKfLAQAA18GVv9/lbnQnOTk5WrJkiebMmaPExETdfffdGjBggE6ePKm//e1vWrVqlebNm3ejwwMAABQZlwPQ9u3bNWfOHM2fP19eXl7q06eP3nrrLTVo0MDRp2vXrmrRooVbCwUAAHAXlwNQixYt9MADD2j27Nnq0qWLfHx88vSJjIxUz5493VIgAACAu7kcgI4cOaJatWoV2qdChQqaM2fODRcFAABQlFy+CiwtLU2bN2/O075582b98MMPbikKAACgKLkcgOLj43XixIk87adOnVJ8fLxbigIAAChKLgegvXv3qmnTpnna77rrLu3du9ctRQEAABQllwOQ1WpVampqnvYzZ86oXLkbvqoeAACg2LgcgB588EGNGzdO6enpjrYLFy7ob3/7mx544AG3FgcAAFAUXF6yef3113XPPfeoVq1auuuuuyRJycnJCgkJ0aeffur2AgEAANzN5QBUo0YN7dq1S3PnztXOnTvl5+enfv36qVevXvl+JxAAAEBJc0Mn7VSoUEGDBg1ydy0AAADF4obPWt67d6+OHz+uq1evOrU//PDDN10UAABAUbqhb4Lu2rWrdu/eLYvFotybyefe+d1ms7m3QgAAADdz+Sqw4cOHKzIyUmlpafL399ePP/6odevWqXnz5lq7dm0RlAgAAOBeLq8Abdy4UatXr1a1atXk5eUlLy8v/elPf9L06dM1bNgw7dixoyjqBAAAcBuXV4BsNpsCAgIkSdWqVdPp06clSbVq1dKBAwfcWx0AAEARcHkF6I477tDOnTsVGRmp6Ohovfrqqypfvrw++OAD1alTpyhqBAAAcCuXA9CECROUlZUlSZo6daoeeugh/fnPf1bVqlW1cOFCtxcIAADgbhYj9zKum3D+/HlVrlzZcSVYaZeRkaGgoCClp6crMDDQ0+UAAIDr4Mrfb5fOAcrJyVG5cuW0Z88ep/YqVaqUmfADAADKPpcCkI+Pj2655Ra3fdfPunXrFBsbq/DwcFksFi1duvSa26xdu1ZNmzaV1WrVrbfeqoSEhDx9Zs2apdq1a8vX11fR0dHasmWLW+oFAABlg8tXgY0fP15/+9vfdP78+ZveeVZWlqKiojRr1qzr6n/06FF16tRJbdu2VXJyskaMGKGBAwdq5cqVjj4LFy7UqFGjNGnSJG3fvl1RUVGKiYlRWlraTdcLAADKBpfPAbrrrrt06NAh5eTkqFatWqpQoYLT69u3b7+xQiwWLVmyRF26dCmwz5gxY7Rs2TKnj+B69uypCxcuaMWKFZKk6OhotWjRQjNnzpQk2e12RUREaOjQoRo7dux11VJU5wAZdrsuX8p023gAAJRmfv4Bsni5vBZTIFf+frt8FVhhAaWobdy4Ue3atXNqi4mJ0YgRIyRJV69e1bZt2zRu3DjH615eXmrXrp02btxY4LjZ2dnKzs52PM/IyHBv4f/f5UuZ8n/9liIZGwCA0ubS6OPyrxjkkX27HIAmTZpUFHVcl5SUFIWEhDi1hYSEKCMjQ5cvX9Z///tf2Wy2fPvs37+/wHGnT5+uKVOmFEnNAACg5Lnhu8GXJePGjdOoUaMczzMyMhQREeH2/fj5B+jS6ONuHxcAgNLIzz/AY/t2OQB5eXkVesl7Ud4NPjQ0VKmpqU5tqampCgwMlJ+fn7y9veXt7Z1vn9DQ0ALHtVqtslqtRVLz71m8vDy21AcAAP7H5QC0ZMkSp+c5OTnasWOHPv744yL/GKlVq1b65ptvnNoSExPVqlUrSVL58uXVrFkzJSUlOc5VstvtSkpK0pAhQ4q0NgAAUHq4HIA6d+6cp+3RRx9Vo0aNtHDhQg0YMOC6x7p48aIOHTrkeH706FElJyerSpUquuWWWzRu3DidOnVKn3zyiSRp8ODBmjlzpp5//nn1799fq1ev1qJFi7Rs2TLHGKNGjVJcXJyaN2+uli1basaMGcrKylK/fv1cnSoAACij3HYO0N13361Bgwa5tM0PP/ygtm3bOp7nnocTFxenhIQEnTlzRseP/++cmcjISC1btkwjR47U22+/rZo1a+pf//qXYmJiHH169Oihs2fP6oUXXlBKSoqaNGmiFStW5DkxGgAAmJdb7gV2+fJljRs3TsuXL9eBAwfcUZdHcS8wAABKnyL9HqA/3vTUMAxlZmbK399fn332mevVAgAAFDOXA9Bbb73lFIC8vLwUHBys6OhoVa5c2a3FAQAAFAWXA1Dfvn2LoAwAAIDi4/INOObMmaPFixfnaV+8eLE+/vhjtxQFAABQlFwOQNOnT1e1atXytFevXl3Tpk1zS1EAAABFyeUAdPz4cUVGRuZpr1WrltMl6wAAACWVywGoevXq2rVrV572nTt3qmrVqm4pCgAAoCi5HIB69eqlYcOGac2aNbLZbLLZbFq9erWGDx+unj17FkWNAAAAbuXyVWAvvviifv75Z91///0qV+63ze12u/r06cM5QAAAoFS44W+CPnjwoJKTk+Xn56fGjRurVq1a7q7NY/gmaAAASp8i/SboXPXq1VO9evVudHMAAACPcfkcoG7duumVV17J0/7qq6/qsccec0tRAAAARcnlALRu3Tp17NgxT3uHDh20bt06txQFAABQlFwOQBcvXlT58uXztPv4+CgjI8MtRQEAABQllwNQ48aNtXDhwjztCxYs0O233+6WogAAAIqSyydBT5w4UY888ogOHz6s++67T5KUlJSkefPm6fPPP3d7gQAAAO7mcgCKjY3V0qVLNW3aNH3++efy8/NTVFSUVq9erSpVqhRFjQAAAG51w98DlCsjI0Pz58/Xhx9+qG3btslms7mrNo/he4AAACh9XPn77fI5QLnWrVunuLg4hYeH64033tB9992nTZs23ehwAAAAxcalj8BSUlKUkJCgDz/8UBkZGerevbuys7O1dOlSToAGAAClxnWvAMXGxqp+/fratWuXZsyYodOnT+vdd98tytoAAACKxHWvAC1fvlzDhg3TM888wy0wAABAqXbdK0Dr169XZmammjVrpujoaM2cOVPnzp0rytoAAACKxHUHoLvvvlv//Oc/debMGT399NNasGCBwsPDZbfblZiYqMzMzKKsEwAAwG1u6jL4AwcO6MMPP9Snn36qCxcu6IEHHtBXX33lzvo8gsvgAQAofYrlMnhJql+/vl599VWdPHlS8+fPv5mhAAAAis1NfxFiWcQKEAAApU+xrQABAACURgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOh4PQLNmzVLt2rXl6+ur6OhobdmypcC+OTk5mjp1qurWrStfX19FRUVpxYoVTn1sNpsmTpyoyMhI+fn5qW7dunrxxRdlGEZRTwUAAJQSHg1ACxcu1KhRozRp0iRt375dUVFRiomJUVpaWr79J0yYoPfff1/vvvuu9u7dq8GDB6tr167asWOHo88rr7yi2bNna+bMmdq3b59eeeUVvfrqq3r33XeLa1oAAKCEsxgeXBqJjo5WixYtNHPmTEmS3W5XRESEhg4dqrFjx+bpHx4ervHjxys+Pt7R1q1bN/n5+emzzz6TJD300EMKCQnRhx9+WGCfa8nIyFBQUJDS09MVGBh4M1MEAADFxJW/3x5bAbp69aq2bdumdu3a/a8YLy+1a9dOGzduzHeb7Oxs+fr6OrX5+flp/fr1juetW7dWUlKSfvrpJ0nSzp07tX79enXo0KHAWrKzs5WRkeH0AAAAZVc5T+343LlzstlsCgkJcWoPCQnR/v37890mJiZGb775pu655x7VrVtXSUlJ+vLLL2Wz2Rx9xo4dq4yMDDVo0EDe3t6y2Wx66aWX1Lt37wJrmT59uqZMmeKeiQEAgBLP4ydBu+Ltt99WvXr11KBBA5UvX15DhgxRv3795OX1v2ksWrRIc+fO1bx587R9+3Z9/PHHev311/Xxxx8XOO64ceOUnp7ueJw4caI4pgMAADzEYytA1apVk7e3t1JTU53aU1NTFRoamu82wcHBWrp0qa5cuaJffvlF4eHhGjt2rOrUqePo89e//lVjx45Vz549JUmNGzfWsWPHNH36dMXFxeU7rtVqldVqddPMAABASeexFaDy5curWbNmSkpKcrTZ7XYlJSWpVatWhW7r6+urGjVq6Ndff9UXX3yhzp07O167dOmS04qQJHl7e8tut7t3AgAAoNTy2AqQJI0aNUpxcXFq3ry5WrZsqRkzZigrK0v9+vWTJPXp00c1atTQ9OnTJUmbN2/WqVOn1KRJE506dUqTJ0+W3W7X888/7xgzNjZWL730km655RY1atRIO3bs0Jtvvqn+/ft7ZI4AAKDk8WgA6tGjh86ePasXXnhBKSkpatKkiVasWOE4Mfr48eNOqzlXrlzRhAkTdOTIEVWsWFEdO3bUp59+qkqVKjn6vPvuu5o4caKeffZZpaWlKTw8XE8//bReeOGF4p4eAAAooTz6PUAlFd8DBABA6VMqvgcIAADAUwhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdDwegGbNmqXatWvL19dX0dHR2rJlS4F9c3JyNHXqVNWtW1e+vr6KiorSihUr8vQ7deqUnnjiCVWtWlV+fn5q3Lixfvjhh6KcBgAAKEU8GoAWLlyoUaNGadKkSdq+fbuioqIUExOjtLS0fPtPmDBB77//vt59913t3btXgwcPVteuXbVjxw5Hn//+979q06aNfHx8tHz5cu3du1dvvPGGKleuXFzTAgAAJZzFMAzDUzuPjo5WixYtNHPmTEmS3W5XRESEhg4dqrFjx+bpHx4ervHjxys+Pt7R1q1bN/n5+emzzz6TJI0dO1YbNmzQd999d8N1ZWRkKCgoSOnp6QoMDLzhcQAAQPFx5e+3x1aArl69qm3btqldu3b/K8bLS+3atdPGjRvz3SY7O1u+vr5ObX5+flq/fr3j+VdffaXmzZvrscceU/Xq1XXXXXfpn//8Z6G1ZGdnKyMjw+kBAADKLo8FoHPnzslmsykkJMSpPSQkRCkpKfluExMTozfffFMHDx6U3W5XYmKivvzyS505c8bR58iRI5o9e7bq1aunlStX6plnntGwYcP08ccfF1jL9OnTFRQU5HhERES4Z5IAAKBE8vhJ0K54++23Va9ePTVo0EDly5fXkCFD1K9fP3l5/W8adrtdTZs21bRp03TXXXdp0KBBeuqpp/SPf/yjwHHHjRun9PR0x+PEiRPFMR0AAOAhHgtA1apVk7e3t1JTU53aU1NTFRoamu82wcHBWrp0qbKysnTs2DHt379fFStWVJ06dRx9wsLCdPvttztt17BhQx0/frzAWqxWqwIDA50eAACg7PJYACpfvryaNWumpKQkR5vdbldSUpJatWpV6La+vr6qUaOGfv31V33xxRfq3Lmz47U2bdrowIEDTv1/+ukn1apVy70TAAAApVY5T+581KhRiouLU/PmzdWyZUvNmDFDWVlZ6tevnySpT58+qlGjhqZPny5J2rx5s06dOqUmTZro1KlTmjx5sux2u55//nnHmCNHjlTr1q01bdo0de/eXVu2bNEHH3ygDz74wCNzBAAAJY9HA1CPHj109uxZvfDCC0pJSVGTJk20YsUKx4nRx48fdzq/58qVK5owYYKOHDmiihUrqmPHjvr0009VqVIlR58WLVpoyZIlGjdunKZOnarIyEjNmDFDvXv3Lu7pAQCAEsqj3wNUUvE9QAAAlD6l4nuAAAAAPIUABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATKecpwsoiQzDkCRlZGR4uBIAAHC9cv9u5/4dLwwBKB+ZmZmSpIiICA9XAgAAXJWZmamgoKBC+1iM64lJJmO323X69GkFBATIYrG4deyMjAxFREToxIkTCgwMdOvYJQ1zLbvMNF/mWnaZab5mmathGMrMzFR4eLi8vAo/y4cVoHx4eXmpZs2aRbqPwMDA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pUuXHH3+ONcpU6YYK1euNA4fPmxs27bN6Nmzp+Hr62v8+OOPnpjCdXvuueeMtWvXGkePHjU2bNhgtGvXzqhWrZqRlpZmGEbZOaa/Z7PZjFtuucUYM2ZMntdK83HNzMw0duzYYezYscOQZLz55pvGjh07HFc9vfzyy0alSpWMf//738auXbuMzp07G5GRkcbly5cdY9x3333Gu+++63h+rfe8JxU236tXrxoPP/ywUbNmTSM5OdnpfZydne0Y44/zvdb7wVMKm2tmZqYxevRoY+PGjcbRo0eNVatWGU2bNjXq1atnXLlyxTFGaTm21/p3bBiGkZ6ebvj7+xuzZ8/Od4zSclyLEgGoCLz77rvGLbfcYpQvX95o2bKlsWnTJsdr9957rxEXF+fUf9GiRcZtt91mlC9f3mjUqJGxbNmyYq7YdZLyfcyZM8fR549zHTFihOP3EhISYnTs2NHYvn178Rfvoh49ehhhYWFG+fLljRo1ahg9evQwDh065Hi9rBzT31u5cqUhyThw4ECe10rzcV2zZk2+/25z52O3242JEycaISEhhtVqNe6///48v4NatWoZkyZNcmor7D3vSYXN9+jRowW+j9esWeMY44/zvdb7wVMKm+ulS5eMBx980AgODjZ8fHyMWrVqGU899VSeIFNaju21/h0bhmG8//77hp+fn3HhwoV8xygtx7UoWQzDMIp0iQkAAKCE4RwgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAABgOgQgALgOFotFS5cu9XQZANyEAASgxOvbt68sFkueR/v27T1dGoBSqpynCwCA69G+fXvNmTPHqc1qtXqoGgClHStAAEoFq9Wq0NBQp0flypUl/fbx1OzZs9WhQwf5+fmpTp06+vzzz5223717t+677z75+fmpatWqGjRokC5evOjU56OPPlKjRo1ktVoVFhamIUOGOL1+7tw5de3aVf7+/qpXr56++uqrop00gCJDAAJQJkycOFHdunXTzp071bt3b/Xs2VP79u2TJGVlZSkmJkaVK1fW1q1btXjxYq1atcop4MyePVvx8fEaNGiQdu/era+++kq33nqr0z6mTJmi7t27a9euXerYsaN69+6t8+fPF+s8AbiJp+/GCgDXEhcXZ3h7exsVKlRwerz00kuGYRiGJGPw4MFO20RHRxvPPPOMYRiG8cEHHxiVK1c2Ll686Hh92bJlhpeXl+OO4OHh4cb48eMLrEGSMWHCBMfzixcvGpKM5cuXu22eAIoP5wABKBXatm2r2bNnO7VVqVLF8XOrVq2cXmvVqpWSk5MlSfv27VNUVJQqVKjgeL1Nmzay2+06cOCALBaLTp8+rfvvv7/QGu68807HzxUqVFBgYKDS0tJudEoAPIgABKBUqFChQp6PpNzFz8/vuvr5+Pg4PbdYLLLb7UVREoAixjlAAMqETZs25XnesGFDSVLDhg21c+dOZWVlOV7fsGGDvLy8VL9+fQUEBKh27dpKSkoq1poBeA4rQABKhezsbKWkpDi1lStXTtWqVZMkLV68WM2bN9ef/vQnzZ07V1u2bNGHH34oSerdu7cmTZqkuLg4TZ48WWfPntXQoUP15JNPKiQkRJI0efJkDR48WNWrV1eHDh2UmZmpDRs2aOjQocU7UQDFggAEoFRYsWKFwsLCnNrq16+v/fv3S/rtCq0FCxbo2WefVVhYmObPn6/bb79dkuTv76+VK1dq+PDhatGihfz9/dWtWze9+eabjrHi4uJ05coVvfXWWxo9erSqVaumRx99tPgmCKBYWQzDMDxdBADcDIvFoiVLlqhLly6eLgVAKcE5QAAAwHQIQAAAwHQ4BwhAqccn+QBcxQoQAAAwHQIQAAAwHQIQAAAwHQIQAAAwHQIQAAAwHQIQAAAwHQIQAAAwHQIQAAAwHQIQAAAwnf8HmNea5BpbO5gAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "import matplotlib.pyplot as plt\n",
        "\n",
        "# Plot training & validation accuracy values\n",
        "plt.plot(history.history['accuracy'])\n",
        "plt.plot(history.history['val_accuracy'])\n",
        "plt.title('Model accuracy')\n",
        "plt.xlabel('Epoch')\n",
        "plt.ylabel('Accuracy')\n",
        "plt.legend(['Train', 'Validation'], loc='upper left')\n",
        "plt.show()\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "id": "Vv-jKMF7YSY4",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 472
        },
        "outputId": "c5013f46-6931-4ce6-8348-52335f1bc583"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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itLu3buN/VeuXKlmzZrJ29tbrVq10scff+y03bIsTZ06VaGhofLx8VFMTIy++uqr8pwCAABwI6UKS/v27dPPf/5zSdIHH3yg4OBgnThxQkuWLNG8efPKtMAfW7FihcaOHatp06Zp3759atOmjWJjY5WZmVlo/x07dighIUGJiYnav3+/4uLiFBcXp0OHDjn6vPLKK5o3b54WLlyoXbt2qWbNmoqNjdX169fLbR4AAMB9lOqeJV9fXx09elQNGjRQv3791LJlS02bNk2nTp1S06ZNdfXq1fKoVVFRUerQoYPmz58vSbLb7QoPD9fo0aM1ceLEAv379++vK1euaO3atY62hx56SG3bttXChQtlWZbCwsI0btw4jR8/XpKUnZ2t4OBgJSUlacCAAcWqqzzuWbLsdl27eqlMxgIAwN35+PrJ5lG239JW3N/f1Usz+E9+8hOtXr1affr00caNG/Xcc89JkjIzM8vtBucbN25o7969mjRpkqPNw8NDMTExSk1NLXSf1NRUjR071qktNjZWq1evliQdO3ZM6enpiomJcWwPCAhQVFSUUlNTiwxLubm5ys3NdTzPyckp7bSKdO3qJfm+2qDMxwUAwB1dHX9SvrUCXHLsUkW0qVOnavz48YqIiFBkZKSio6MlSf/+97/105/+tEwLvOnChQvKz89XcHCwU3twcLDS09ML3Sc9Pd3Y/+afJRlTkmbOnKmAgADHIzw8vMTzAQAA7qFUZ5b69u2rn/3sZzp37pzjM5YkqUuXLurTp0+ZFVdZTZo0yemMVU5OTpkHJh9fP10df7JMxwQAwF35+Pq57NilCkuSFBISopCQEJ0+fVqSVL9+/XL9QMq6deuqWrVqysjIcGrPyMhQSEhIkTWa+t/8MyMjQ6GhoU592rZtW2QtXl5ejq97KS82Dw+XnW4EAAD/p1SX4ex2u1544QUFBASoYcOGatiwoQIDA/Xiiy/KbreXdY2SJE9PT7Vr104pKSlOdaSkpDguA94qOjraqb8kJScnO/o3atRIISEhTn1ycnK0a9euIscEAAB3l1KdWZo8ebLeeecdvfzyy3r44YclSZ9++qmmT5+u69ev66WXXirTIm8aO3ashgwZovbt2ysyMlJz587VlStXNGzYMEnS4MGDde+992rmzJmSpGeffVadOnXSnDlz1KNHDy1fvlyfffaZ3n77bUmS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Gxur69evFzlmSV/3FcU016tXr2rfvn2aMmWK9u3bpw8//FBpaWnq1avXbcctyWuhotxuXSWpa9euTnW/9957xjEr67pKt5/vj+d57tw5LVq0SDabTfHx8cZxK+PalhsLLhMZGWmNHDnS8Tw/P98KCwuzZs6cWWj/fv36WT169HBqi4qKsn7zm9+Ua51lLTMz05Jkbd26tcg+ixcvtgICAiquqDI0bdo0q02bNsXuX1XW1bIs69lnn7UaN25s2e32Qre787pKslatWuV4brfbrZCQEGv27NmOtqysLMvLy8t67733ihynpK97V7h1roXZvXu3Jck6ceJEkX1K+lpwhcLmOmTIEKt3794lGscd1tWyire2vXv3tjp37mzs4w5rW5Y4s+QiN27c0N69exUTE+No8/DwUExMjFJTUwvdJzU11am/JMXGxhbZv7LKzs6WJNWuXdvY7/Lly2rYsKHCw8PVu3dvHT58uCLKKxNfffWVwsLCdN9992ngwIE6efJkkX2ryrreuHFD7777rp566injF0q787r+2LFjx5Senu60dgEBAYqKiipy7Urzuq+ssrOzZbPZFBgYaOxXktdCZbJlyxbVq1dPTZs21TPPPKNvv/22yL5VaV0zMjK0bt06JSYm3ravu65taRCWXOTChQvKz89XcHCwU3twcLDS09ML3Sc9Pb1E/Ssju92uMWPG6OGHH9YDDzxQZL+mTZtq0aJF+uijj/Tuu+/KbrerY8eOOn36dAVWWzpRUVFKSkrShg0btGDBAh07dkw///nPdenSpUL7V4V1laTVq1crKytLQ4cOLbKPO6/rrW6uT0nWrjSv+8ro+vXrmjBhghISEoxftFrS10Jl0bVrVy1ZskQpKSmaNWuWtm7dqm7duik/P7/Q/lVlXSXp73//u/z8/PT4448b+7nr2pZWdVcXgLvLyJEjdejQodte246OjlZ0dLTjeceOHdW8eXP97W9/04svvljeZd6Rbt26OX5u3bq1oqKi1LBhQ73//vvF+r81d/XOO++oW7duCgsLK7KPO68rfpCXl6d+/frJsiwtWLDA2NddXwsDBgxw/NyqVSu1bt1ajRs31pYtW9SlSxcXVlb+Fi1apIEDB972jRfuuralxZklF6lbt66qVaumjIwMp/aMjAyFhIQUuk9ISEiJ+lc2o0aN0tq1a7V582bVr1+/RPvWqFFDP/3pT/X111+XU3XlJzAwUPfff3+Rtbv7ukrSiRMntGnTJj399NMl2s+d1/Xm+pRk7Urzuq9MbgalEydOKDk52XhWqTC3ey1UVvfdd5/q1q1bZN3uvq43bdu2TWlpaSV+HUvuu7bFRVhyEU9PT7Vr104pKSmONrvdrpSUFKf/8/6x6Ohop/6SlJycXGT/ysKyLI0aNUqrVq3SJ598okaNGpV4jPz8fB08eFChoaHlUGH5unz5sr755psia3fXdf2xxYsXq169eurRo0eJ9nPndW3UqJFCQkKc1i4nJ0e7du0qcu1K87qvLG4Gpa+++kqbNm1SnTp1SjzG7V4LldXp06f17bffFlm3O6/rj73zzjtq166d2rRpU+J93XVti83Vd5jfzZYvX255eXlZSUlJ1pdffmmNGDHCCgwMtNLT0y3LsqxBgwZZEydOdPTfvn27Vb16devVV1+1jhw5Yk2bNs2qUaOGdfDgQVdNoVieeeYZKyAgwNqyZYt17tw5x+Pq1auOPrfOdcaMGdbGjRutb775xtq7d681YMAAy9vb2zp8+LArplAi48aNs7Zs2WIdO3bM2r59uxUTE2PVrVvXyszMtCyr6qzrTfn5+VaDBg2sCRMmFNjm7ut66dIla//+/db+/fstSdZrr71m7d+/3/EOsJdfftkKDAy0PvroI+uLL76wevfubTVq1Mi6du2aY4zOnTtbf/3rXx3Pb/e6dxXTXG/cuGH16tXLql+/vvX55587vY5zc3MdY9w619u9FlzFNNdLly5Z48ePt1JTU61jx45ZmzZtsh588EGrSZMm1vXr1x1juMu6Wtbt/x1blmVlZ2dbvr6+1oIFCwodw13WtrwQllzsr3/9q9WgQQPL09PTioyMtHbu3OnY1qlTJ2vIkCFO/d9//33r/vvvtzw9Pa2WLVta69atq+CKS05SoY/Fixc7+tw61zFjxjj+XoKDg63u3btb+/btq/jiS6F///5WaGio5enpad17771W//79ra+//tqxvaqs600bN260JFlpaWkFtrn7um7evLnQf7s352S3260pU6ZYwcHBlpeXl9WlS5cCfw8NGza0pk2b5tRmet27immux44dK/J1vHnzZscYt871dq8FVzHN9erVq9Zjjz1mBQUFWTVq1LAaNmxoDR8+vEDocZd1tazb/zu2LMv629/+Zvn4+FhZWVmFjuEua1tebJZlWeV66goAAMCNcc8SAACAAWEJAADAgLAEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAKAc2m02rV692dRkAygBhCUCVM3ToUNlstgKPrl27uro0AG6ouqsLAIDy0LVrVy1evNipzcvLy0XVAHBnnFkCUCV5eXkpJCTE6XHPPfdI+uES2YIFC9StWzf5+Pjovvvu0wcffOC0/8GDB9W5c2f5+PioTp06GjFihC5fvuzUZ9GiRWrZsqW8vLwUGhqqUaNGOW2/cOGC+vTpI19fXzVp0kRr1qwp30kDKBeEJQB3pSlTpig+Pl4HDhzQwIEDNWDAAB05ckSSdOXKFcXGxuqee+7Rnj17tHLlSm3atMkpDC1YsEAjR47UiBEjdPDgQa1Zs0Y/+clPnI4xY8YM9evXT1988YW6d++ugQMH6uLFixU6TwBlwNXf5AsAZW3IkCFWtWrVrJo1azo9XnrpJcuyLEuS9dvf/tZpn6ioKOuZZ56xLMuy3n77beuee+6xLl++7Ni+bt06y8PDw/Ht82FhYdbkyZOLrEGS9fzzzzueX7582ZJkrV+/vszmCaBicM8SgCrp0Ucf1YIFC5zaateu7fg5OjraaVt0dLQ+//xzSdKRI0fUpk0b1axZ07H94Ycflt1uV1pammw2m86ePasuXboYa2jdurXj55o1a8rf31+ZmZmlnRIAFyEsAaiSatasWeCyWFnx8fEpVr8aNWo4PbfZbLLb7eVREoByxD1LAO5KO3fuLPC8efPmkqTmzZvrwIEDunLlimP79u3b5eHhoaZNm8rPz08RERFKSUmp0JoBuAZnlgBUSbm5uUpPT3dqq169uurWrStJWrlypdq3b6+f/exnWrp0qXbv3q133nlHkjRw4EBNmzZNQ4YM0fTp03X+/HmNHj1agwYNUnBwsCRp+vTp+u1vf6t69eqpW7duunTpkrZv367Ro0dX7EQBlDvCEoAqacOGDQoNDXVqa9q0qY4ePSrph3eqLV++XL/73e8UGhqq9957Ty1atJAk+fr6auPGjXr22WfVoUMH+fr6Kj4+Xq+99ppjrCFDhuj69et6/fXXNX78eNWtW1d9+/atuAkCqDA2y7IsVxcBABXJZrNp1apViouLc3UpANwA9ywBAAAYEJYAAAAMuGcJwF2Huw8AlARnlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAsAQAAGBCWAAAADP4fwnZYvAsgSXUAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "# Plot training & validation loss values\n",
        "plt.plot(history.history['loss'])\n",
        "plt.plot(history.history['val_loss'])\n",
        "plt.title('Model loss')\n",
        "plt.xlabel('Epoch')\n",
        "plt.ylabel('Loss')\n",
        "plt.legend(['Train', 'Validation'], loc='upper left')\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n"
      ],
      "metadata": {
        "id": "xo-8_3ZpP2JW"
      },
      "execution_count": 21,
      "outputs": []
    },
    {
      "source": [
        "validation_generator.reset()\n",
        "predictions = vgg_model.predict(validation_generator, steps=validation_generator.samples // validation_generator.batch_size + 1)\n",
        "predicted_classes = np.argmax(predictions, axis=1)\n"
      ],
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Ebf4GBRlYUmG",
        "outputId": "f5bd9ecf-0f14-4598-b7b7-16fcecd5ccf6"
      },
      "execution_count": 22,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.11/dist-packages/keras/src/models/functional.py:237: UserWarning: The structure of `inputs` doesn't match the expected structure.\n",
            "Expected: ['keras_tensor']\n",
            "Received: inputs=Tensor(shape=(32, 224, 224, 3))\n",
            "  warnings.warn(msg)\n",
            "/usr/local/lib/python3.11/dist-packages/keras/src/ops/nn.py:907: UserWarning: You are using a softmax over axis -1 of a tensor of shape (32, 1). This axis has size 1. The softmax operation will always return the value 1, which is likely not what you intended. Did you mean to use a sigmoid instead?\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 239ms/step\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import roc_curve, auc\n",
        "from itertools import cycle\n"
      ],
      "metadata": {
        "id": "hJma2wGxP4Wp"
      },
      "execution_count": 23,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "true_classes = validation_generator.classes\n",
        "class_labels = list(validation_generator.class_indices.keys())\n"
      ],
      "metadata": {
        "id": "0EE8HtZqbPaM"
      },
      "execution_count": 24,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import seaborn as sns\n",
        "cm = confusion_matrix(true_classes, predicted_classes)\n",
        "disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=class_labels)\n",
        "\n",
        "plt.figure(figsize=(10, 8))\n",
        "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_labels, yticklabels=class_labels)\n",
        "plt.title('Confusion Matrix Heatmap')\n",
        "plt.xlabel('Predicted')\n",
        "plt.ylabel('True')\n",
        "plt.show()\n",
        "\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 667
        },
        "id": "kIA9Lwr7bP_P",
        "outputId": "6bc71391-fbfd-471f-a2ce-be459eab15eb"
      },
      "execution_count": 25,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.11/dist-packages/sklearn/metrics/_classification.py:407: UserWarning: A single label was found in 'y_true' and 'y_pred'. For the confusion matrix to have the correct shape, use the 'labels' parameter to pass all known labels.\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x800 with 2 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxQAAAK9CAYAAAC95yoDAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAARfdJREFUeJzt3XuUlmW9P/73DMownEEcDongkWRLHtJtiAFmoYF5ykzNAE+VDpaaZpSWQklh5umbWqsEMynNQo1MxVCMDZqV5glR1CS3IKYJIoocnt8f/pj9jIDMc4cO6Ou11rOWz3285tblms+8P9d9VZVKpVIAAAAKqG7uAQAAAJsuBQUAAFCYggIAAChMQQEAABSmoAAAAApTUAAAAIUpKAAAgMIUFAAAQGEKCgAAoDAFBfCue+KJJzJkyJB06NAhVVVVufHGGzfo9f/xj3+kqqoqEydO3KDX3ZQNHjw4gwcPbu5hAPAepKCA96knn3wyX/ziF7PtttumVatWad++fQYMGJBLLrkkr7322jt67xEjRuShhx7Kd7/73VxzzTXZY4893tH7vZtGjhyZqqqqtG/ffq3P8YknnkhVVVWqqqrygx/8oOLrP/fcczn33HPzwAMPbIDRFldVVZVRo0atdd/EiRNTVVWVv/zlL+/Y/TeW5wBAsllzDwB49/3+97/PZz7zmdTU1GT48OHZeeed88Ybb2TGjBk588wz88gjj+QnP/nJO3Lv1157LbNmzco3v/nNdf5C+p/q1atXXnvttWy++ebvyPXXZ7PNNsvSpUvzu9/9LkcccUSjfddee21atWqV119/vdC1n3vuuZx33nnp3bt3dt111yafd/vttxe638aq6HMAYMNTUMD7zNNPP50jjzwyvXr1yrRp09K9e/eGffX19Zk7d25+//vfv2P3f+GFF5IkHTt2fMfuUVVVlVatWr1j11+fmpqaDBgwIL/85S/XKCgmTZqUYcOG5Te/+c27MpalS5emdevWadmy5btyPwDef7Q8wfvM+PHjs2TJkvzsZz9rVEystv322+crX/lKw/cVK1Zk7Nix2W677VJTU5PevXvnG9/4RpYtW9bovN69e+fAAw/MjBkz8t///d9p1apVtt122/z85z9vOObcc89Nr169kiRnnnlmqqqq0rt37yRvtgqt/udy5557bqqqqhptmzp1avbZZ5907Ngxbdu2TZ8+ffKNb3yjYf+65lBMmzYtH/3oR9OmTZt07NgxBx98cGbPnr3W+82dOzcjR45Mx44d06FDhxx77LFZunTpuh/sWxx99NH5wx/+kJdffrlh23333ZcnnngiRx999BrHv/TSSznjjDPSr1+/tG3bNu3bt88nP/nJ/P3vf2845q677sqee+6ZJDn22GMbWqdW/5yDBw/OzjvvnL/+9a8ZOHBgWrdu3fBc3jqHYsSIEWnVqtUaP//++++fTp065bnnnmvyz9pUjz32WA4//PB07tw5rVq1yh577JGbb775HXsODz74YAYNGpTWrVtn++23zw033JAkmT59evbaa6/U1tamT58+ueOOOxqN4ZlnnsnJJ5+cPn36pLa2NltssUU+85nP5B//+Eej41a3dt1999354he/mC222CLt27fP8OHD8+9//3sDPz2AjZeCAt5nfve732XbbbfN3nvv3aTjTzjhhHzrW9/K7rvvnosuuiiDBg3KuHHjcuSRR65x7Ny5c3P44YfnE5/4RC688MJ06tQpI0eOzCOPPJIkOeyww3LRRRclSY466qhcc801ufjiiysa/yOPPJIDDzwwy5Yty5gxY3LhhRfmoIMOyv/8z/+87Xl33HFH9t9//yxcuDDnnntuTj/99MycOTMDBgxY4xfFJDniiCPyyiuvZNy4cTniiCMyceLEnHfeeU0e52GHHZaqqqr89re/bdg2adKkfPCDH8zuu+++xvFPPfVUbrzxxhx44IH54Q9/mDPPPDMPPfRQBg0a1PDL/U477ZQxY8YkSb7whS/kmmuuyTXXXJOBAwc2XOfFF1/MJz/5yey66665+OKLs++++651fJdcckm23HLLjBgxIitXrkyS/PjHP87tt9+eyy67LD169Fjvz/j666/nX//61xqfJUuWrHHsI488ko985COZPXt2vv71r+fCCy9MmzZtcsghh2Ty5Mkb/Dn8+9//zoEHHpi99tor48ePT01NTY488shcd911OfLIIzN06NB873vfy6uvvprDDz88r7zySsO59913X2bOnJkjjzwyl156ab70pS/lj3/8YwYPHrzWonLUqFGZPXt2zj333AwfPjzXXnttDjnkkJRKpfU+Q4D3hBLwvrFo0aJSktLBBx/cpOMfeOCBUpLSCSec0Gj7GWecUUpSmjZtWsO2Xr16lZKU7r777oZtCxcuLNXU1JS++tWvNmx7+umnS0lKF1xwQaNrjhgxotSrV681xvDtb3+7VP6/qosuuqiUpPTCCy+sc9yr7zFhwoSGbbvuumuprq6u9OKLLzZs+/vf/16qrq4uDR8+fI37HXfccY2ueeihh5a22GKLdd6z/Odo06ZNqVQqlQ4//PDSfvvtVyqVSqWVK1eWunXrVjrvvPPW+gxef/310sqVK9f4OWpqakpjxoxp2Hbfffet8bOtNmjQoFKS0pVXXrnWfYMGDWq07bbbbislKX3nO98pPfXUU6W2bduWDjnkkPX+jKVSqZRkvZ/77ruv4fj99tuv1K9fv9Lrr7/esG3VqlWlvffeu7TDDju8I89h0qRJDdsee+yxUpJSdXV16Z577lnjGZRfZ+nSpWtcc9asWaUkpZ///OcN2yZMmFBKUvrwhz9ceuONNxq2jx8/vpSkdNNNN63r8QG8p0go4H1k8eLFSZJ27do16fhbbrklSXL66ac32v7Vr341SdaYa9G3b9989KMfbfi+5ZZbpk+fPnnqqacKj/mtVs+9uOmmm7Jq1aomnTN//vw88MADGTlyZDp37tyw/UMf+lA+8YlPNPyc5b70pS81+v7Rj340L774YsMzbIqjjz46d911VxYsWJBp06ZlwYIFa213St6cd1Fd/eb/kleuXJkXX3yxoZ3rb3/7W5PvWVNTk2OPPbZJxw4ZMiRf/OIXM2bMmBx22GFp1apVfvzjHzf5XgcffHCmTp26xufMM89sdNxLL72UadOmNaQ+q5OMF198Mfvvv3+eeOKJ/O///m/D+DfEc2jbtm2jFK1Pnz7p2LFjdtppp+y1114N21f/c/l/o7W1tQ3/vHz58rz44ovZfvvt07Fjx7WO4Qtf+EKjFwCcdNJJ2Wyzzdb63xXAe5GCAt5H2rdvnySN2jvezjPPPJPq6upsv/32jbZ369YtHTt2zDPPPNNo+9Zbb73GNTp16rRB+8k/+9nPZsCAATnhhBPStWvXHHnkkbn++uvftrhYPc4+ffqssW+nnXbKv/71r7z66quNtr/1Z+nUqVOSVPSzDB06NO3atct1112Xa6+9Nnvuuecaz3K1VatW5aKLLsoOO+yQmpqadOnSJVtuuWUefPDBLFq0qMn3/MAHPlDRBOwf/OAH6dy5cx544IFceumlqaura/K5W221VT7+8Y+v8enbt2+j4+bOnZtSqZRzzjknW265ZaPPt7/97STJwoULk2y457DVVlutMfemQ4cO6dmz5xrbksb/Xl977bV861vfSs+ePRuN4eWXX17rGHbYYYdG39u2bZvu3buvtZUO4L3IW57gfaR9+/bp0aNHHn744YrOe+svZuvSokWLtW4vNaGXfF33WN3fv1ptbW3uvvvu3Hnnnfn973+fW2+9Ndddd10+9rGP5fbbb1/nGCr1n/wsq9XU1OSwww7L1VdfnaeeeirnnnvuOo89//zzc8455+S4447L2LFj07lz51RXV+fUU09tchKTNP7relPcf//9Db/MP/TQQznqqKMqOr8pVo//jDPOyP7777/WY1YXWhvqOazr319T/r2ecsopmTBhQk499dT079+/YQHGI488sqIxALxfKCjgfebAAw/MT37yk8yaNSv9+/d/22N79eqVVatW5YknnshOO+3UsP3555/Pyy+/3PDGpg2hU6dOjd6ItNpbU5Akqa6uzn777Zf99tsvP/zhD3P++efnm9/8Zu688858/OMfX+vPkSRz5sxZY99jjz2WLl26pE2bNv/5D7EWRx99dK666qpUV1evdSL7ajfccEP23Xff/OxnP2u0/eWXX06XLl0avje1uGuKV199Nccee2z69u2bvffeO+PHj8+hhx7a8AalDWXbbbdNkmy++eZr/fdTrjmew9rGMGLEiFx44YUN215//fW1/veZvLlYYfnk9yVLlmT+/PkZOnToOzZGgI2Jlid4n/na176WNm3a5IQTTsjzzz+/xv4nn3wyl1xySZI0/EL01jcx/fCHP0ySDBs2bIONa7vttsuiRYvy4IMPNmybP39+ozcAJW/247/V6oXN3voq29W6d++eXXfdNVdffXWjXwoffvjh3H777e/oL3777rtvxo4dm//3//5funXrts7jWrRosUb68etf/7phbsFqqwufdf1yW4mzzjor8+bNy9VXX50f/vCH6d27d0aMGLHO51hUXV1dBg8enB//+MeZP3/+GvtXr02SNM9zeKu1jeGyyy5bIy1b7Sc/+UmWL1/e8P2KK67IihUr8slPfnKDjw1gYyShgPeZ7bbbLpMmTcpnP/vZ7LTTTo1Wyp45c2Z+/etfZ+TIkUmSXXbZJSNGjMhPfvKTvPzyyxk0aFD+/Oc/5+qrr84hhxyyzleSFnHkkUfmrLPOyqGHHpovf/nLWbp0aa644orsuOOOjSbCjhkzJnfffXeGDRuWXr16ZeHChbn88suz1VZbZZ999lnn9S+44IJ88pOfTP/+/XP88cfntddey2WXXZYOHTq8bSvSf6q6ujpnn332eo878MADM2bMmBx77LHZe++989BDD+Xaa69t+Ov+atttt106duyYK6+8Mu3atUubNm2y1157ZZtttqloXNOmTcvll1+eb3/72w2vsZ0wYUIGDx6cc845J+PHj6/oeuvzox/9KPvss0/69euXE088Mdtuu22ef/75zJo1K88++2zDOhPv9nNYmwMPPDDXXHNNOnTokL59+2bWrFm54447ssUWW6z1+DfeeCP77bdfjjjiiMyZMyeXX3559tlnnxx00EH/8VgANgnN+IYpoBk9/vjjpRNPPLHUu3fvUsuWLUvt2rUrDRgwoHTZZZc1erXn8uXLS+edd15pm222KW2++ealnj17lkaPHt3omFLpzdfGDhs2bI37vPV1pet6bWypVCrdfvvtpZ133rnUsmXLUp8+fUq/+MUv1nht7B//+MfSwQcfXOrRo0epZcuWpR49epSOOuqo0uOPP77GPd76StE77rijNGDAgFJtbW2pffv2pU996lOlRx99tNExq+/31tfSrn5F6NNPP73OZ1oqNX5t7Lqs67WxX/3qV0vdu3cv1dbWlgYMGFCaNWvWWl/3etNNN5X69u1b2myzzRr9nIMGDSr913/911rvWX6dxYsXl3r16lXafffdS8uXL2903GmnnVaqrq4uzZo1621/hiSl+vr6te5b/azKXxtbKpVKTz75ZGn48OGlbt26lTbffPPSBz7wgdKBBx5YuuGGG96V57Cu/0bf+rP8+9//Lh177LGlLl26lNq2bVvaf//9S4899lipV69epREjRqzxc06fPr30hS98odSpU6dS27ZtS5/73OcavZ4Y4L2uqlSy8g4AVGrixIk59thjc99992WPPfZo7uEANBtzKAAAgMIUFAAAQGEKCgAAoDBzKAAAgMIkFAAAQGEKCgAAoDAFBQAAUNh7cqXs+smzm3sIAAC8jR8dulNzD2Gdancb1Wz3fu3+/9ds9y5KQgEAABT2nkwoAACgsCp/c6+EpwUAABSmoAAAAArT8gQAAOWqqpp7BJsUCQUAAFCYhAIAAMqZlF0RTwsAAChMQgEAAOXMoaiIhAIAAChMQQEAABSm5QkAAMqZlF0RTwsAAChMQgEAAOVMyq6IhAIAAChMQQEAABSm5QkAAMqZlF0RTwsAAChMQgEAAOVMyq6IhAIAAChMQgEAAOXMoaiIpwUAABSmoAAAAArT8gQAAOVMyq6IhAIAAChMQgEAAOVMyq6IpwUAABSmoAAAAArT8gQAAOVMyq6IhAIAAChMQgEAAOVMyq6IpwUAABQmoQAAgHISiop4WgAAQGEKCgAAoDAtTwAAUK7aa2MrIaEAAAAKk1AAAEA5k7Ir4mkBAACFKSgAAIDCtDwBAEC5KpOyKyGhAAAACpNQAABAOZOyK+JpAQAAhUkoAACgnDkUFZFQAAAAhSkoAABgEzRu3LjsueeeadeuXerq6nLIIYdkzpw5axw3a9asfOxjH0ubNm3Svn37DBw4MK+99lrD/pdeeimf+9zn0r59+3Ts2DHHH398lixZ0uRxKCgAAKBcVXXzfSowffr01NfX55577snUqVOzfPnyDBkyJK+++mrDMbNmzcoBBxyQIUOG5M9//nPuu+++jBo1KtXV/3evz33uc3nkkUcyderUTJkyJXfffXe+8IUvNP1xlUqlUkUj3wTUT57d3EMAAOBt/OjQnZp7COtUO+SCZrv3a7efWfjcF154IXV1dZk+fXoGDhyYJPnIRz6ST3ziExk7duxaz5k9e3b69u2b++67L3vssUeS5NZbb83QoUPz7LPPpkePHuu9r4QCAADKVVU122fZsmVZvHhxo8+yZcuaNOxFixYlSTp37pwkWbhwYe69997U1dVl7733TteuXTNo0KDMmDGj4ZxZs2alY8eODcVEknz84x9PdXV17r333ibdV0EBAAAbiXHjxqVDhw6NPuPGjVvveatWrcqpp56aAQMGZOedd06SPPXUU0mSc889NyeeeGJuvfXW7L777tlvv/3yxBNPJEkWLFiQurq6RtfabLPN0rlz5yxYsKBJY/baWAAA2EiMHj06p59+eqNtNTU16z2vvr4+Dz/8cKP0YdWqVUmSL37xizn22GOTJLvttlv++Mc/5qqrrmpSodIUCgoAACjXjCtl19TUNKmAKDdq1KiGydRbbbVVw/bu3bsnSfr27dvo+J122inz5s1LknTr1i0LFy5stH/FihV56aWX0q1btybdX8sTAABsgkqlUkaNGpXJkydn2rRp2WabbRrt7927d3r06LHGq2Qff/zx9OrVK0nSv3//vPzyy/nrX//asH/atGlZtWpV9tprryaNQ0IBAADlNpGVsuvr6zNp0qTcdNNNadeuXcOchw4dOqS2tjZVVVU588wz8+1vfzu77LJLdt1111x99dV57LHHcsMNNyR5M6044IADcuKJJ+bKK6/M8uXLM2rUqBx55JFNesNToqAAAIBN0hVXXJEkGTx4cKPtEyZMyMiRI5Mkp556al5//fWcdtppeemll7LLLrtk6tSp2W677RqOv/baazNq1Kjst99+qa6uzqc//elceumlTR6HdSgAAHjXbdTrUAy9pNnu/dotX2m2exdlDgUAAFCYggIAACjMHAoAACi3iUzK3lhIKAAAgMIkFAAAUK4ZF7bbFHlaAABAYQoKAACgMC1PAABQTstTRTwtAACgMAkFAACU89rYikgoAACAwhQUAABAYVqeAACgnEnZFfG0AACAwiQUAABQzqTsikgoAACAwiQUAABQzhyKinhaAABAYQoKAACgMC1PAABQzqTsikgoAACAwiQUAABQpkpCUREJBQAAUJiCAgAAKEzLEwAAlNHyVBkJBQAAUJiEAgAAygkoKiKhAAAACpNQAABAGXMoKiOhAAAAClNQAAAAhWl5AgCAMlqeKiOhAAAACpNQAABAGQlFZSQUAABAYQoKAACgMC1PAABQRstTZSQUAABAYRIKAAAoJ6CoiIQCAAAoTEIBAABlzKGojIQCAAAoTEEBAAAUpuUJAADKaHmqjIQCAAAoTEIBAABlJBSVkVAAAACFKSgAAIDCtDwBAEAZLU+VkVAAAACFSSgAAKCcgKIiEgoAAKAwCQUAAJQxh6IyEgoAAKAwBQUAAFCYlicAACij5akyEgoAAKAwCQUAAJSRUFRGQgEAABSmoAAAAArT8gQAAOV0PFVEQgEAABQmoQAAgDImZVdGQgEAABQmoQAAgDISispIKAAAgMIUFAAAQGFangAAoIyWp8pIKAAAgMIkFAAAUEZCURkJBQAAUJiCAgAAKEzLEwAAlNPxVBEJBQAAUJiEAgAAypiUXRkJBQAAUJiEAgAAykgoKiOhAAAAClNQAAAAhWl5AgCAMlqeKiOhAAAACpNQAABAOQFFRSQUAABAYQoKAACgMC1PAABQxqTsykgoAACAwiQUAABQRkJRGQkFAABQmIICAAAoTMsTAACU0fJUGQkFAABQmIQCAADKSCgqI6EAAAAKk1AAAEA5AUVFJBQAAEBhCgoAAKAwLU8AAFDGpOzKSCgAAIDCJBQAAFBGQlEZCQUAAFCYggIAAChMyxMAAJTR8VQZCQUAAFCYhAIAAMqYlF0ZCQUAAFCYhAIAAMoIKCojoQAAAApTUAAAAIVpeQIAgDImZVdGQgEAABQmoQAAgDICispIKAAAgMIUFAAAQGFangAAoEx1tZ6nSkgoAACAwiQUAABQxqTsykgoAACAwiQUAABQxsJ2lZFQAADAJmjcuHHZc889065du9TV1eWQQw7JnDlzGh0zePDgVFVVNfp86UtfanTMvHnzMmzYsLRu3Tp1dXU588wzs2LFiiaPQ0IBAACboOnTp6e+vj577rlnVqxYkW984xsZMmRIHn300bRp06bhuBNPPDFjxoxp+N66deuGf165cmWGDRuWbt26ZebMmZk/f36GDx+ezTffPOeff36TxqGgAACAMs3Z8bRs2bIsW7as0baamprU1NSsceytt97a6PvEiRNTV1eXv/71rxk4cGDD9tatW6dbt25rvd/tt9+eRx99NHfccUe6du2aXXfdNWPHjs1ZZ52Vc889Ny1btlzvmLU8AQDARmLcuHHp0KFDo8+4ceOadO6iRYuSJJ07d260/dprr02XLl2y8847Z/To0Vm6dGnDvlmzZqVfv37p2rVrw7b9998/ixcvziOPPNKk+0ooAACgTHNOyh49enROP/30RtvWlk681apVq3LqqadmwIAB2XnnnRu2H3300enVq1d69OiRBx98MGeddVbmzJmT3/72t0mSBQsWNComkjR8X7BgQZPGrKAAAICNxLram9anvr4+Dz/8cGbMmNFo+xe+8IWGf+7Xr1+6d++e/fbbL08++WS22267/3i8iZYnAADYpI0aNSpTpkzJnXfema222uptj91rr72SJHPnzk2SdOvWLc8//3yjY1Z/X9e8i7dSUAAAQJm3vmb13fxUolQqZdSoUZk8eXKmTZuWbbbZZr3nPPDAA0mS7t27J0n69++fhx56KAsXLmw4ZurUqWnfvn369u3bpHFoeQIAgE1QfX19Jk2alJtuuint2rVrmPPQoUOH1NbW5sknn8ykSZMydOjQbLHFFnnwwQdz2mmnZeDAgfnQhz6UJBkyZEj69u2bz3/+8xk/fnwWLFiQs88+O/X19U1uvVJQAABAmU1loewrrrgiyZuL15WbMGFCRo4cmZYtW+aOO+7IxRdfnFdffTU9e/bMpz/96Zx99tkNx7Zo0SJTpkzJSSedlP79+6dNmzYZMWJEo3Ur1kdBAQAAm6BSqfS2+3v27Jnp06ev9zq9evXKLbfcUngcCgoAACjTnK+N3RSZlA0AABSmoAAAAArT8gQAAGV0PFVGQgEAABQmoQAAgDImZVdGQgEAABSmoAAAAArT8gQAAGV0PFVGQgEAABQmoQAAgDImZVdGQgEAABQmoQAAgDICispIKAAAgMIUFAAAQGFangAAoIxJ2ZWRUAAAAIVJKAAAoIyAojISCgAAoDAFBQAAUJiWJwAAKGNSdmUkFAAAQGESCgAAKCOgqIyEAgAAKExCAQAAZcyhqIyEAgAAKExBAQAAFKblCQAAyuh4qoyEAgAAKExCAQAAZUzKroyEAgAAKExBAQAAFKblCQAAymh5qoyEAgAAKExCAQAAZQQUlZFQAAAAhSkoAACAwrQ8AQBAGZOyKyOhAAAACpNQAABAGQFFZSQUAABAYRIKAAAoYw5FZSQUAABAYQoKAACgMC1PAABQRsdTZSQUAABAYRIKAAAoUy2iqIiEAgAAKExBAQAAFKblCQAAyuh4qoyEAgAAKExCAQAAZayUXRkJBQAAUJiEAgAAylQLKCoioQAAAApTUAAAAIVpeQIAgDImZVdGQgEAABQmoQAAgDICispIKAAAgMIUFAAAQGFangAAoExV9DxVQkIBAAAUJqEAAIAyVsqujIQCAAAoTEIBAABlLGxXGQkFAABQmIICAAAoTMsTAACU0fFUGQkFAABQmIQCAADKVIsoKiKhAAAAClNQAAAAhWl5AgCAMjqeKiOhAAAACpNQAABAGStlV0ZCAQAAFCahAACAMgKKykgoAACAwhQUAABAYVqeAACgjJWyKyOhAAAACpNQAABAGflEZSQUAABAYQoKAACgMC1PAABQxkrZlZFQAAAAhUkoAACgTLWAoiISCgAAoDAJBQAAlDGHojISCgAAoLCNKqF45ZVXUiqVGr5XV1enbdu2zTgiAADg7TRrQvHAAw9k6NChDd979OiRTp06NXw6duyY++67rxlHCADA+01VVfN9NkXNmlBcdtll2WeffRptu+aaa/KBD3wgpVIpV111VS699NJcc801zTRCAADg7TRrQTFz5syMGjWq0baPfOQj2XbbbZMktbW1OeKII5pjaAAAvE+ZlF2ZZm15euaZZ7Lllls2fB8zZky6dOnS8L179+55/vnnm2NoAABAEzRrQdGqVas888wzDd9PO+20tG/fvuH7P//5z7Ru3bo5hgYAADRBsxYUu+22W2688cZ17v/tb3+b3Xbb7d0bEAAA73vVVc332RQ16xyKk08+OUceeWR69+6dk046KdXVb9Y3K1euzOWXX57LLrsskyZNas4hAgAAb6NZC4pPf/rTOf3003PKKafkG9/4RsNk7KeeeipLlizJ6aefnsMPP7w5hwgAwPuMSdmVafaF7b7//e/n0EMPzS9/+cs88cQTSZKBAwfmqKOOykc+8pFmHh0AAPB2mr2gSN58VaziAQCAjYF8ojLNOin7iSeeyFFHHZXFixevsW/RokU5+uij89RTTzXDyAAAgKZo1oLiggsuSM+ePRu9Kna1Dh06pGfPnrnggguaYWQAAEBTNGvL0/Tp0/OLX/xinfuPOOKIHH300e/iiAAAeL+rNim7Is2aUMybNy91dXXr3N+lS5f885//fBdHBAAAVKJZC4oOHTrkySefXOf+uXPnrrUdCgAA3ilVVc332RQ1a0ExcODAXHbZZevcf+mll+ajH/3ouzgiAACgEoUKij/96U855phj0r9///zv//5vkuSaa67JjBkzKrrO6NGj84c//CGHH354/vznP2fRokVZtGhR7r333nz605/ObbfdltGjRxcZIgAA8C6ouKD4zW9+k/333z+1tbW5//77s2zZsiRvvub1/PPPr+hau+22W2644Ybcfffd6d+/fzp37pzOnTtn7733zp/+9Kdcf/312X333SsdIgAAFFZVVdVsn01RxW95+s53vpMrr7wyw4cPz69+9auG7QMGDMh3vvOdigdw4IEH5plnnsmtt96auXPnplQqZccdd8yQIUPSunXriq8HAAC8eyouKObMmZOBAweusb1Dhw55+eWXCw2itrY2hx56aKFzAQBgQ9pEg4JmU3HLU7du3TJ37tw1ts+YMSPbbrttRdcaOnRoFi1a1PD9e9/7XqOi5MUXX0zfvn0rHSIAAPAuqbigOPHEE/OVr3wl9957b6qqqvLcc8/l2muvzRlnnJGTTjqpomvddtttDXMwkuT888/PSy+91PB9xYoVmTNnTqVDBAAA3iUVtzx9/etfz6pVq7Lffvtl6dKlGThwYGpqanLGGWfklFNOqehapVLpbb8DAMC7zUrZlam4oKiqqso3v/nNnHnmmZk7d26WLFmSvn37pm3btu/E+ADek4bsuEV27dEuXdu2zPJVpTz14mu58ZGFWbjkjbUef3L/nvmvbm3z43v+mQfnL2nY3ql2sxy5a/fs2KV1lq1clXvnLcpNjyzMKn+fAeBdUnFBsVrLli3/4/kNa3s91qb6uiyASuzQpXXufurfeebfr6W6qioH/VddThmwdcbe8WTeWNm4Gth3u85rvUZVkpP698ziZSty4d3/SPtWm2X4h3tk5apSbn70hXfhpwB4b/LraGUqLij23Xfft/2lf9q0aU2+VqlUysiRI1NTU5Mkef311/OlL30pbdq0SZJG8ysA3kt+NPOfjb5f89fn8v1hO2brjq0y98XXGrZv1aEm++3QOePvfDrjhu7Y6JydurZJ9/Y1uewP8/LKspXJomWZ8ugLOWTnuvx+9gtZKaUAeE8bN25cfvvb3+axxx5LbW1t9t5773z/+99Pnz591ji2VCpl6NChufXWWzN58uQccsghDfvmzZuXk046KXfeeWfatm2bESNGZNy4cdlss6aVChUXFLvuumuj78uXL88DDzyQhx9+OCNGjKjoWm89/phjjlnjmOHDh1c6RIBNTu3mb74j49U3VjVs27xFVUbu8YFc//cFWbxs5RrnbNO5Ns8tWvZmMfH/m73w1Ry1eYt0b1+TZxf5owxAEZtKx8z06dNTX1+fPffcMytWrMg3vvGNDBkyJI8++mjDH+hXu/jii9f6c61cuTLDhg1Lt27dMnPmzMyfPz/Dhw/P5ptv3uRFqysuKC666KK1bj/33HOzZMmSte5blwkTJlR0/LPPPpsePXqkurril1MBbLSqknz6Q13z5ItLM/+V/ysCDu/XNU+99FqjORPl2tdslsXLVjTatvp7+1abJQoKgPe0W2+9tdH3iRMnpq6uLn/9618brRv3wAMP5MILL8xf/vKXdO/evdE5t99+ex599NHccccd6dq1a3bdddeMHTs2Z511Vs4999y0bNlyvePYYL+ZH3PMMbnqqqs21OXWqm/fvvnHP/7RaNuyZcuyePHiRp+Vy9c+qRFgY/TZXbqlR7uaXPXn/23Y1q9b2+y4ZZv85sEFzTgyAN5ta/vdtqnTAFav79a58//NvVu6dGmOPvro/OhHP0q3bt3WOGfWrFnp169funbt2rBt//33z+LFi/PII4806b4brKCYNWtWWrVqtaEut1Zre63suHHj0qFDh0afv/7mJ+/oOAA2lCM+1DU7d2ubS2bMy8uv/1/asOOWbdKlzea54MA+ufTgD+bSgz+YJDlxr63ylX22TvJmGtG+pnHQvPr74tcbJxcANF11M37W9rvtuHHj1jvmVatW5dRTT82AAQOy8847N2w/7bTTsvfee+fggw9e63kLFixoVEwkafi+YEHT/qhVccvTYYcd1uh7qVTK/Pnz85e//CXnnHNOpZf7j40ePTqnn356o21fu/Xpd30cAJU64kNds0uPdrn4T8/kxaXLG+2b+vi/MvMfLzfadvbHt81vHnw+Dy14swXq6ZdeywF9uqRtyxZZ8sab8yg+WNcmry1fmQWvSGoBNkVr+9129QuM3k59fX0efvjhzJgxo2HbzTffnGnTpuX+++/f4OMsV3FB0aFDh0bfq6ur06dPn4wZMyZDhgzZYANrqpqamjUecovN19/rBdCcPrtLt+yxVfv8+J5ns2zFqrSvaZEkeW35qixfVcriZSvXOhH7pdeWNxQfs59/NfMXL8uIPXrkxocXpn2rzfKpvlvm7qf+nRUWogAorDknZa/td9v1GTVqVKZMmZK77747W221VcP2adOm5cknn0zHjh0bHf/pT386H/3oR3PXXXelW7du+fOf/9xo//PPP58ka22RWpuKCoqVK1fm2GOPTb9+/dKpU6dKTgWgzMBt3/x/6GkDezXafs1fn8s98xY16RqlJFfO+meO3LV7zhjUu2FhuymzrUEB8H5QKpVyyimnZPLkybnrrruyzTbbNNr/9a9/PSeccEKjbf369ctFF12UT33qU0mS/v3757vf/W4WLlyYurq6JMnUqVPTvn37Jq85V1FB0aJFiwwZMiSzZ89uloJiU3mFF8D61E+evUHOeem1Fbl81j/XcjQA73X19fWZNGlSbrrpprRr165hzkOHDh1SW1ubbt26rTVl2HrrrRuKjyFDhqRv3775/Oc/n/Hjx2fBggU5++yzU19f3+SkpOJJ2TvvvHOeeuqpSk/bINY2KRsAADak6qrm+1TiiiuuyKJFizJ48OB079694XPdddc1+RotWrTIlClT0qJFi/Tv3z/HHHNMhg8fnjFjxjT5GhXPofjOd76TM844I2PHjs2HP/zhNRbNaN++faWXXKdSqZQXXnihIX559NFH06NHjw12fQAA2FQV+WP72s7p1atXbrnllsLjaHJCMWbMmLz66qsZOnRo/v73v+eggw7KVlttlU6dOqVTp07p2LFjxW1QrVu3zgsv/F+v77BhwzJ//vyG7wsXLmy0+EbPnj3TokWLiu4BAACV2FQSio1FkxOK8847L1/60pdy5513brCbv/76642qpLvvvjuvvfZao2O0OQEAwMaryQXF6l/sBw0a9I4NZm1MxAYA4N3k98/KVDQp28MFAADKVTQpe8cdd1xvUfHSSy81+XpVVVWNrvfW7wAAwMatooLivPPOW2Ol7P9EqVRqVKQsWbIku+22W6qrqxv2AwDAu2lTnRzdXCoqKI488siGV7huCBMmTNhg1wIAAN59TS4o3olWpGOOOcZrYAEA2KjowK9MkydlvxPtR1tttVW+/vWv54knntjg1wYAAN55TS4oVq1atUHbnZLk5JNPzg033JAPfvCD+ehHP5qJEydm6dKlG/QeAADAO6ei18ZuaOecc07mzp2bP/7xj9l2220zatSodO/ePSeeeGLuvffe5hwaAADvU9VVVc322RQ1a0Gx2uDBg3P11VdnwYIFufDCCzN79uz0798///Vf/5Uf/vCHzT08AABgHTaKgmK1tm3b5oQTTsiMGTPyu9/9LgsWLMiZZ57Z3MMCAOB9pLoZP5uijWrcS5cuzcSJEzNo0KAcdNBB2WKLLfLd7363uYcFAACsQ0XrULxTZs6cmauuuiq//vWvs2LFihx++OEZO3ZsBg4c2NxDAwDgfWYTncrQbJq1oBg/fnwmTJiQxx9/PHvssUcuuOCCHHXUUWnXrl1zDgsAAGiiZi0oLrjgghxzzDH59a9/nZ133rk5hwIAABTQrAXFc889l80337w5hwAAAI1sqq9vbS7NWlBcccUVTTruy1/+8js8EgAAoIhmLSguuuii9R5TVVWloAAA4F0joKhMsxYUTz/99Nvuf/bZZzNmzJh3aTQAAEClNqp1KN7qxRdfzM9+9rPmHgYAALAOG8U6FAAAsLGo1vJUkY06oQAAADZuEgoAACjjtbGVadaC4rDDDnvb/S+//PK7MxAAAKCQZi0oOnTosN79w4cPf5dGAwAAXhtbqWYtKCZMmNCctwcA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AIDCFBQAAEBhCgoAAKAwBQXARq6mpibf/va3TcgGYKNkUjYAAFCYhAIAAChMQQEAABSmoAAAAApTUAAAAIUpKACaaOTIkTnkkEPWuq937965+OKL88Ybb6RLly753ve+t9bjxo4dm65du2b58uWZOHFiqqqq1vi0atWqyeNZ2/kHHHBAo+Puv//+fOYzn0nXrl3TqlWr7LDDDjnxxBPz+OOPNzruN7/5TT72sY+lU6dOqa2tTZ8+fXLcccfl/vvvb9J4AHh/UlAAbEAtW7bMMccckwkTJqyxr1QqZeLEiRk+fHg233zzJEn79u0zf/78Rp9nnnmmyfc74IAD1jj/l7/8ZcP+KVOm5CMf+UiWLVuWa6+9NrNnz84vfvGLdOjQIeecc07DcWeddVY++9nPZtddd83NN9+cOXPmZNKkSdl2220zevTo/+CJAPBet1lzDwDgveb444/PJZdckhkzZmSfffZp2D59+vQ89dRTOf744xu2VVVVpVu3boXvVVNTs87zly5dmmOPPTZDhw7N5MmTG7Zvs8022WuvvfLyyy8nSe65556MHz8+l1xySb785S83HLf11lvnwx/+cLxdHIC3I6EA2MD69euXPffcM1dddVWj7RMmTMjee++dD37wg+/KOG677bb861//yte+9rW17u/YsWOS5Je//GXatm2bk08+ea3HVVVVvVNDBOA9QEEB8A44/vjj8+tf/zpLlixJkrzyyiu54YYbctxxxzU6btGiRWnbtm2jzyc/+ckm32fKlClrnH/++ecnSZ544okkWW8B8/jjj2fbbbfNZpv9X2j9wx/+sNE1Fy1a1OQxAfD+ouUJ4B1w1FFH5bTTTsv111+f4447Ltddd12qq6vz2c9+ttFx7dq1y9/+9rdG22pra5t8n3333TdXXHFFo22dO3dOkv+oVem4447LQQcdlHvvvTfHHHOMticA1klBAfAOaN++fQ4//PBMmDAhxx13XCZMmJAjjjgibdu2bXRcdXV1tt9++8L3adOmzTrP33HHHZMkjz32WPr377/Oa+ywww6ZMWNGli9f3jBZvGPHjunYsWOeffbZwmMD4P1ByxPAO+T444/PjBkzMmXKlMycObPRZOx3w5AhQ9KlS5eMHz9+rftXT8o+6qijsmTJklx++eXv4ugAeK+QUABUYNGiRXnggQcabdtiiy3WeuzAgQOz/fbbZ/jw4fngBz+Yvffee41jSqVSFixYsMb2urq6VFev/28+y5YtW+P8zTbbLF26dEmbNm3y05/+NJ/5zGdy0EEH5ctf/nK23377/Otf/8r111+fefPm5Ve/+lX69++fr371q/nqV7+aZ555Jocddlh69uyZ+fPn52c/+1mqqqqaNBYA3p8UFAAVuOuuu7Lbbrs12rau5KGqqirHHXdcvvGNb6xzLYfFixene/fua2yfP39+k14ne+utt65xfp8+ffLYY48lSQ4++ODMnDkz48aNy9FHH53FixenZ8+e+djHPpbvfOc7Def84Ac/yH//93/niiuuyFVXXZWlS5ema9euGThwYGbNmpX27duvdywAvD9Vlcy0AwAACpJhAwAAhSkoADZC8+bNW2N9ifLPvHnzmnuIAJBEyxPARmnFihX5xz/+sc79vXv3brQQHQA0FwUFAABQmJYnAACgMAUFAABQmIICAAAoTEEBAAAUpqAA2MiMHDkyhxxySMP3wYMH59RTT33Xx3HXXXelqqoqL7/88rt+bwA2HQoKgCYaOXJkqqqqUlVVlZYtW2b77bfPmDFjsmLFinf0vr/97W8zduzYJh2rCADg3eYl5gAVOOCAAzJhwoQsW7Yst9xyS+rr67P55ptn9OjRjY5744030rJlyw1yz86dO2+Q6wDAO0FCAVCBmpqadOvWLb169cpJJ52Uj3/847n55psb2pS++93vpkePHunTp0+S5J///GeOOOKIdOzYMZ07d87BBx/caMG6lStX5vTTT0/Hjh2zxRZb5Gtf+1reujzQW1ueli1blrPOOis9e/ZMTU1Ntt9++/zsZz/LP/7xj+y7775Jkk6dOqWqqiojR45MkqxatSrjxo3LNttsk9ra2uyyyy654YYbGt3nlltuyY477pja2trsu+++b7uwHgCspqAA+A/U1tbmjTfeSJL88Y9/zJw5czJ16tRMmTIly5cvz/7775927drlT3/6U/7nf/4nbdu2zQEHHNBwzoUXXpiJEyfmqquuyowZM/LSSy9l8uTJb3vP4cOH55e//GUuvfTSzJ49Oz/+8Y/Ttm3b9OzZM7/5zW+SJHPmzMn8+fNzySWXJEnGjRuXn//857nyyivzyCOP5LTTTssxxxyT6dOnJ3mz8DnssMPyqU99Kg888EBOOOGEfP3rX3+nHhsA7yFangAKKJVK+eMf/5jbbrstp5xySl544YW0adMmP/3pTxtanX7xi19k1apV+elPf5qqqqokyYQJE9KxY8fcddddGTJkSC6++OKMHj06hx12WJLkyiuvzG233bbO+z7++OO5/vrrM3Xq1Hz84x9Pkmy77bYN+1e3R9XV1aVjx45J3kw0zj///Nxxxx3p379/wzkzZszIj3/84wwaNChXXHFFtttuu1x44YVJkj59+uShhx7K97///Q341AB4L1JQAFRgypQpadu2bZYvX55Vq1bl6KOPzrnnnpv6+vr069ev0byJv//975k7d27atWvX6Bqvv/56nnzyySxatCjz58/PXnvt1bBvs802yx577LFG29NqDzzwQFq0aJFBgwY1ecxz587N0qVL84lPfKLR9jfeeCO77bZbkmT27NmNxpGkofgAgLejoACowL777psrrrgiLVu2TI8ePbLZZv/3v9E2bdo0OnbJkiX58Ic/nGuvvXaN62y55ZaF7l9bW1vxOUuWLEmS/P73v88HPvCBRvtqamoKjQMAVlNQAFSgTZs22X777Zt07O67757rrrsudXV1ad++/VqP6d69e+69994MHDgwSbJixYr89a9/ze67777W4/v165dVq1Zl+vTpDS1P5VYnJCtXrmzY1rdv39TU1GTevHnrTDZ22mmn3HzzzY223XPPPev/IQF43zMpG+Ad8rnPfS5dunTJwQcfnD/96U95+umnc9ddd+XLX/5ynn322STJV77ylXzve9/LjTfemMceeywnn3zy264h0bt374wYMSLHHXdcbrzxxoZrXn/99UmSXr16paqqKlOmTMkLL7yQJUuWpF27djnjjDNy2mmn5eqrr86TTz6Zv/3tb7nsssty9dVXJ0m+9KUv5YknnsiZZ56ZOXPmZNKkSZk4ceI7/YgAeA9QUAC8Q1q3bp277747W2+9dQ477LDstNNOOf744/P66683JBZf/epX8/nPfz4jRoxI//79065duxx66KFve90rrrgihx9+eE4++eR88IMfzIknnphXX301SfKBD3wg5513Xr7+9a+na9euGTVqVJJk7NixOeecczJu3LjstNNOOeCAA/L73/8+22yzTZJk6623zm9+85vceOON2WWXXXLllVfm/PPPfwefDgDvFVWldc38AwAAWA8JBQAAUJiCAgAAKExBAQAAFKagAAAAClNQAAAAhSkoAACAwhQUAABAYQoKAACgMAUFAABQmIICAAAoTEEBAAAU9v8B+yfenAFOjgQAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Compute ROC curve and ROC area for each class\n",
        "fpr = dict()\n",
        "tpr = dict()\n",
        "roc_auc = dict()\n",
        "n_classes = len(class_labels)\n",
        "\n",
        "for i in range(n_classes):\n",
        "    fpr[i], tpr[i], _ = roc_curve(true_classes == i, predictions[:, i])\n",
        "    roc_auc[i] = auc(fpr[i], tpr[i])\n",
        "\n",
        "# Plot ROC curve for each class\n",
        "plt.figure(figsize=(12, 8))\n",
        "colors = cycle(['aqua', 'darkorange', 'cornflowerblue', 'red', 'green', 'blue', 'purple', 'brown', 'pink', 'gray'])\n",
        "\n",
        "for i, color in zip(range(n_classes), colors):\n",
        "    plt.plot(fpr[i], tpr[i], color=color, lw=2,\n",
        "             label='ROC curve of class {0} (area = {1:0.2f})'\n",
        "             ''.format(class_labels[i], roc_auc[i]))\n",
        "\n",
        "plt.plot([0, 1], [0, 1], 'k--', lw=2)\n",
        "plt.xlim([0.0, 1.0])\n",
        "plt.ylim([0.0, 1.05])\n",
        "plt.title('Receiver Operating Characteristic (ROC) Curves')\n",
        "plt.xlabel('False Positive Rate')\n",
        "plt.ylabel('True Positive Rate')\n",
        "plt.legend(loc=\"lower right\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 535
        },
        "id": "WummA_hEQpUk",
        "outputId": "49056826-57ba-4c1b-aaa8-bbecb1833883"
      },
      "execution_count": 26,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.11/dist-packages/sklearn/metrics/_ranking.py:1179: UndefinedMetricWarning: No negative samples in y_true, false positive value should be meaningless\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1200x800 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/QAAAK9CAYAAACKBSdyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAqtxJREFUeJzs3Xd4FGXj9fGzCWm00HvoAgmB0HuvUqV3QUBCV5pUqYKgVJESElTEBwQEVBBFEQWkKL0nIL13SKgJJPP+4cv8XBMggSST8v1cV66HvWd292Sz8cnZ+54Zm2EYhgAAAAAAQKLiYHUAAAAAAAAQcxR6AAAAAAASIQo9AAAAAACJEIUeAAAAAIBEiEIPAAAAAEAiRKEHAAAAACARotADAAAAAJAIUegBAAAAAEiEKPQAAAAAACRCFHoASMTy5s2rt956y+oYyU6NGjVUo0YNq2O80Lhx42Sz2XTjxg2royQ4NptN48aNi5XHOnPmjGw2mxYtWhQrjydJO3fulLOzs86ePRtrjxnb2rVrpzZt2lgdAwCSNQo9ADzDokWLZLPZzK8UKVIoZ86ceuutt3Tx4kWr4yVo9+/f1wcffKDixYsrZcqUcnd3V9WqVbV48WIZhmF1vGg5evSoxo0bpzNnzlgdJZLw8HB98cUXqlGjhjJkyCAXFxflzZtXXbt21e7du62OFyuWLl2qWbNmWR3DTnxmGjVqlNq3b688efKYYzVq1LD7b5Kbm5uKFy+uWbNmKSIiIsrHuXnzpt577z0VLlxYrq6uypAhg+rXr68ffvjhmc8dEhKi8ePHy8fHR6lTp5abm5u8vb01bNgwXbp0ydxv2LBhWrVqlQ4cOBDt7ys5vHcBID7ZjMTylxUAxLNFixapa9eumjBhgvLly6dHjx7pzz//1KJFi5Q3b14dPnxYrq6ulmYMDQ2Vg4ODnJycLM3xb1evXlXt2rUVGBiodu3aqXr16nr06JFWrVqlLVu2qG3btlqyZIkcHR2tjvpcK1euVOvWrfX7779Hmo0PCwuTJDk7O8d7rocPH6pFixZav369qlWrpiZNmihDhgw6c+aMVqxYoePHj+vcuXPKlSuXxo0bp/Hjx+v69evKlClTvGd9FY0bN9bhw4fj7AOVR48eKUWKFEqRIsUrZzIMQ6GhoXJycoqV9/X+/ftVsmRJbd++XRUrVjTHa9SooZMnT2ry5MmSpBs3bmjp0qXatWuXRo4cqUmTJtk9zrFjx1S7dm1dv35dXbt2VZkyZXTnzh0tWbJE+/fv15AhQzR16lS7+5w6dUp16tTRuXPn1Lp1a1WpUkXOzs46ePCgvv76a2XIkEHHjx839y9fvrwKFy6sxYsXv/D7isl7FwAQTQYAIEpffPGFIcnYtWuX3fiwYcMMScby5cstSmathw8fGuHh4c/cXr9+fcPBwcH4/vvvI20bMmSIIcmYMmVKXEaM0r1792K0/zfffGNIMn7//fe4CfSS+vbta0gyZs6cGWnbkydPjKlTpxrnz583DMMwxo4da0gyrl+/Hmd5IiIijAcPHsT64zZq1MjIkydPrD5meHi48fDhw5e+f1xkiso777xj5M6d24iIiLAbr169ulG0aFG7sYcPHxp58uQx0qRJYzx58sQcDwsLM7y9vY2UKVMaf/75p919njx5YrRt29aQZCxbtswcf/z4seHj42OkTJnS+OOPPyLlCg4ONkaOHGk3Nm3aNCNVqlTG3bt3X/h9xeS9+ype9ecMAIkJhR4AnuFZhf6HH34wJBkffvih3XhgYKDRsmVLI3369IaLi4tRunTpKEvt7du3jQEDBhh58uQxnJ2djZw5cxpvvvmmXel69OiRMWbMGKNAgQKGs7OzkStXLuO9994zHj16ZPdYefLkMbp06WIYhmHs2rXLkGQsWrQo0nOuX7/ekGSsXbvWHLtw4YLRtWtXI0uWLIazs7Ph5eVlfPbZZ3b3+/333w1Jxtdff22MGjXKyJEjh2Gz2Yzbt29H+Zrt2LHDkGR069Ytyu2PHz82XnvtNSN9+vRmCTx9+rQhyZg6daoxY8YMI3fu3Iarq6tRrVo149ChQ5EeIzqv89Of3aZNm4zevXsbmTNnNtKlS2cYhmGcOXPG6N27t1GoUCHD1dXVyJAhg9GqVSvj9OnTke7/36+n5b569epG9erVI71Oy5cvNyZOnGjkzJnTcHFxMWrVqmX8/fffkb6HOXPmGPny5TNcXV2NsmXLGlu2bIn0mFE5f/68kSJFCqNu3brP3e+pp4X+77//Nrp06WK4u7sbadOmNd566y3j/v37dvt+/vnnRs2aNY3MmTMbzs7OhqenpzFv3rxIj5knTx6jUaNGxvr1643SpUsbLi4uZkGL7mMYhmH8+OOPRrVq1YzUqVMbadKkMcqUKWMsWbLEMIx/Xt//vvb/LtLR/f2QZPTt29f43//+Z3h5eRkpUqQwvv32W3Pb2LFjzX1DQkKMd9991/y9zJw5s1GnTh1jz549L8z09D38xRdf2D1/YGCg0bp1ayNTpkyGq6urUahQoUiFOCq5c+c23nrrrUjjURV6wzCMVq1aGZKMS5cumWNff/21IcmYMGFClM9x584dI126dEaRIkXMsWXLlhmSjEmTJr0w41MHDhwwJBmrV69+7n4xfe926dIlyg9Pnr6n/y2qn/OKFSuM9OnTR/k6BgcHGy4uLsbgwYPNsei+p3755RejcuXKhru7u5EqVSqjUKFCxogRI6L1PQFAXIj+OjMAgCSZy23Tp09vjh05ckSVK1dWzpw5NXz4cKVKlUorVqxQs2bNtGrVKjVv3lySdO/ePVWtWlWBgYHq1q2bSpUqpRs3bmjNmjW6cOGCMmXKpIiICDVt2lRbt26Vr6+vPD09dejQIc2cOVPHjx/Xd999F2WuMmXKKH/+/FqxYoW6dOlit2358uVKnz696tevL+mfZfEVKlSQzWZTv379lDlzZv3000/q3r27QkJCNGDAALv7f/DBB3J2dtaQIUMUGhr6zKXma9eulSR17tw5yu0pUqRQhw4dNH78eG3btk116tQxty1evFh3795V37599ejRI33yySeqVauWDh06pKxZs8bodX6qT58+ypw5s8aMGaP79+9Lknbt2qXt27erXbt2ypUrl86cOaP58+erRo0aOnr0qFKmTKlq1arpnXfe0ezZszVy5Eh5enpKkvm/zzJlyhQ5ODhoyJAhCg4O1scff6yOHTvqr7/+MveZP3+++vXrp6pVq2rgwIE6c+aMmjVrpvTp079wqfFPP/2kJ0+e6M0333zufv/Vpk0b5cuXT5MnT9bevXu1cOFCZcmSRR999JFdrqJFi6pp06ZKkSKF1q5dqz59+igiIkJ9+/a1e7xjx46pffv26tmzp3r06KHChQvH6DEWLVqkbt26qWjRohoxYoTSpUunffv2af369erQoYNGjRql4OBgXbhwQTNnzpQkpU6dWpJi/Pvx22+/acWKFerXr58yZcqkvHnzRvka9erVSytXrlS/fv3k5eWlmzdvauvWrQoMDFSpUqWemykqBw8eVNWqVeXk5CRfX1/lzZtXJ0+e1Nq1ayMtjf+3ixcv6ty5cypVqtQz9/mvpyflS5cunTn2ot9Fd3d3vfHGG/ryyy914sQJFSxYUGvWrJGkGL2/vLy85Obmpm3btkX6/fu3l33vRtd/f86vvfaamjdvrtWrV2vBggV2/8367rvvFBoaqnbt2kmK/nvqyJEjaty4sYoXL64JEybIxcVFJ06c0LZt2+LkewKAaLH6EwUASKieztL++uuvxvXr143z588bK1euNDJnzmy4uLjYLQ2tXbu2UaxYMbvZnIiICKNSpUrGa6+9Zo6NGTPmmbNZT5fXfvXVV4aDg0OkJa9+fn6GJGPbtm3m2L9n6A3DMEaMGGE4OTkZt27dMsdCQ0ONdOnS2c2ad+/e3ciePbtx48YNu+do166d4e7ubs6eP515zp8/f7SWVTdr1syQ9MwZfMMwjNWrVxuSjNmzZxuG8X+zm25ubsaFCxfM/f766y9DkjFw4EBzLLqv89OfXZUqVeyWIRuGEeX38XRlweLFi82x5y25f9YMvaenpxEaGmqOf/LJJ4Ykc6VBaGiokTFjRqNs2bLG48ePzf0WLVpkSHrhDP3AgQMNSca+ffueu99TT2cz/7tionnz5kbGjBntxqJ6XerXr2/kz5/fbixPnjyGJGP9+vWR9o/OY9y5c8dIkyaNUb58+UjLov+9xPxZy9tj8vshyXBwcDCOHDkS6XH0nxl6d3d3o2/fvpH2+7dnZYpqhr5atWpGmjRpjLNnzz7ze4zKr7/+Gmk1zVPVq1c3ihQpYly/ft24fv26ERQUZLz33nuGJKNRo0Z2+5YoUcJwd3d/7nPNmDHDkGSsWbPGMAzDKFmy5AvvE5VChQoZDRo0eO4+MX3vxnSGPqqf888//xzla9mwYUO792R031MzZ86M80NYACCmOMs9ALxAnTp1lDlzZnl4eKhVq1ZKlSqV1qxZY86m3rp1S7/99pvatGmju3fv6saNG7px44Zu3ryp+vXr6++//zbPir9q1Sr5+PhEOZNls9kkSd988408PT1VpEgR87Fu3LihWrVqSZJ+//33Z2Zt27atHj9+rNWrV5tjv/zyi+7cuaO2bdtK+ucEXqtWrVKTJk1kGIbdc9SvX1/BwcHau3ev3eN26dJFbm5uL3yt7t69K0lKkybNM/d5ui0kJMRuvFmzZsqZM6d5u1y5cipfvrx+/PFHSTF7nZ/q0aNHpJOU/fv7ePz4sW7evKmCBQsqXbp0kb7vmOratavdTGDVqlUl/XOiMUnavXu3bt68qR49etidjK1jx452Kz6e5elr9rzXNyq9evWyu121alXdvHnT7mfw79clODhYN27cUPXq1XXq1CkFBwfb3T9fvnzmao9/i85jbNiwQXfv3tXw4cMjnVTy6e/A88T096N69ery8vJ64eOmS5dOf/31l91Z3F/W9evXtWXLFnXr1k25c+e22/ai7/HmzZuS9Mz3Q1BQkDJnzqzMmTOrSJEimjp1qpo2bRrpknl379594fvkv7+LISEhMX5vPc36oksjvux7N7qi+jnXqlVLmTJl0vLly82x27dva8OGDeZ/D6Xov6eeroD4/vvvn3lVAQCIbyy5B4AXmDt3rgoVKqTg4GB9/vnn2rJli1xcXMztJ06ckGEYGj16tEaPHh3lY1y7dk05c+bUyZMn1bJly+c+399//63AwEBlzpz5mY/1LD4+PipSpIiWL1+u7t27S/pnuX2mTJnMP06vX7+uO3fuyN/fX/7+/tF6jnz58j0381NP/1i/e/eu3fLff3tW6X/ttdci7VuoUCGtWLFCUsxe5+flfvjwoSZPnqwvvvhCFy9etLuM3n+La0z9t7w9LWW3b9+WJPOa4gULFrTbL0WKFM9cCv5vadOmlfR/r2Fs5Hr6mNu2bdPYsWO1Y8cOPXjwwG7/4OBgubu7m7ef9X6IzmOcPHlSkuTt7R2j7+GpmP5+RPe9+/HHH6tLly7y8PBQ6dKl1bBhQ3Xu3Fn58+ePccanH+C87Pco6ZmXd8ybN68CAgIUERGhkydPatKkSbp+/XqkD0fSpEnzwpL939/FtGnTmtljmvVFH1S87Hs3uqL6OadIkUItW7bU0qVLFRoaKhcXF61evVqPHz+2K/TRfU+1bdtWCxcu1Ntvv63hw4erdu3aatGihVq1aiUHB+bIAFiDQg8AL1CuXDmVKVNG0j+zyFWqVFGHDh107NgxpU6d2pypGTJkSJSzllLkAvc8ERERKlasmGbMmBHldg8Pj+fev23btpo0aZJu3LihNGnSaM2aNWrfvr05I/w0b6dOnSIda/9U8eLF7W5HZ3Ze+ucY8++++04HDx5UtWrVotzn4MGDkhStWdN/e5nXOarc/fv31xdffKEBAwaoYsWKcnd3l81mU7t27V551u1Zlyx7VjmLqSJFikiSDh06pBIlSkT7fi/KdfLkSdWuXVtFihTRjBkz5OHhIWdnZ/3444+aOXNmpNclqtc1po/xsmL6+xHd926bNm1UtWpVffvtt/rll180depUffTRR1q9erUaNGjwyrmjK2PGjJL+70Og/0qVKpXduScqV66sUqVKaeTIkZo9e7Y57unpqf379+vcuXORPtB56r+/i0WKFNG+fft0/vz5F/535t9u374d5Qdy/xbT9+6zPiAIDw+PcvxZP+d27dppwYIF+umnn9SsWTOtWLFCRYoUkY+Pj7lPdN9Tbm5u2rJli37//XetW7dO69ev1/Lly1WrVi398ssvCf5SnACSJgo9AMSAo6OjJk+erJo1a2rOnDkaPny4OYPn5ORk94d2VAoUKKDDhw+/cJ8DBw6odu3a0VqC/F9t27bV+PHjtWrVKmXNmlUhISHmyZ8kKXPmzEqTJo3Cw8NfmDemGjdurMmTJ2vx4sVRFvrw8HAtXbpU6dOnV+XKle22/f3335H2P378uDlzHZPX+XlWrlypLl26aPr06ebYo0ePdOfOHbv9Xua1f5E8efJI+me1Qc2aNc3xJ0+e6MyZM5E+SPmvBg0ayNHRUf/73/9i9eRia9euVWhoqNasWWNX/p53eMfLPkaBAgUkSYcPH37uB13Pev1f9ffjebJnz64+ffqoT58+unbtmkqVKqVJkyaZhT66z/f0vfqi3/WoPC2+p0+fjtb+xYsXV6dOnbRgwQINGTLEfO0bN26sr7/+WosXL9b7778f6X4hISH6/vvvVaRIEfPn0KRJE3399df63//+pxEjRkTr+Z88eaLz58+radOmz90vpu/d9OnTR/qdlP5vlUt0VatWTdmzZ9fy5ctVpUoV/fbbbxo1apTdPjF5Tzk4OKh27dqqXbu2ZsyYoQ8//FCjRo3S77//Huv/PQWA6GB9EADEUI0aNVSuXDnNmjVLjx49UpYsWVSjRg0tWLBAly9fjrT/9evXzX+3bNlSBw4c0Lfffhtpv6ezpW3atNHFixcVEBAQaZ+HDx+aZ2t/Fk9PTxUrVkzLly/X8uXLlT17drty7ejoqJYtW2rVqlVRFo5/542pSpUqqU6dOvriiy/0ww8/RNo+atQoHT9+XEOHDo00o/bdd9/ZHQO/c+dO/fXXX2aZisnr/DyOjo6RZsw//fTTSDN/qVKlkqQoS8XLKlOmjDJmzKiAgAA9efLEHF+yZMkzZ2T/zcPDQz169NAvv/yiTz/9NNL2iIgITZ8+XRcuXIhRrqczi/89/OCLL76I9ceoV6+e0qRJo8mTJ+vRo0d22/5931SpUkV5CMSr/n5EJTw8PNJzZcmSRTly5FBoaOgLM/1X5syZVa1aNX3++ec6d+6c3bYXrdbImTOnPDw8tHv37mjnHzp0qB4/fmw3w9yqVSt5eXlpypQpkR4rIiJCvXv31u3btzV27Fi7+xQrVkyTJk3Sjh07Ij3P3bt3I5Xho0eP6tGjR6pUqdJzM8b0vVugQAEFBwebqwgk6fLly1H+t/N5HBwc1KpVK61du1ZfffWVnjx5YrfcXor+e+rWrVuRtj9dbfDv9wkAxCdm6AHgJbz33ntq3bq1Fi1apF69emnu3LmqUqWKihUrph49eih//vy6evWqduzYoQsXLujAgQPm/VauXKnWrVurW7duKl26tG7duqU1a9bIz89PPj4+evPNN7VixQr16tVLv//+uypXrqzw8HAFBQVpxYoV+vnnn81DAJ6lbdu2GjNmjFxdXdW9e/dIx3dOmTJFv//+u8qXL68ePXrIy8tLt27d0t69e/Xrr79G+YdrdC1evFi1a9fWG2+8oQ4dOqhq1aoKDQ3V6tWrtWnTJrVt21bvvfdepPsVLFhQVapUUe/evRUaGqpZs2YpY8aMGjp0qLlPdF/n52ncuLG++uorubu7y8vLSzt27NCvv/5qLnV+qkSJEnJ0dNRHH32k4OBgubi4qFatWsqSJctLvzbOzs4aN26c+vfvr1q1aqlNmzY6c+aMFi1apAIFCkRrBnj69Ok6efKk3nnnHa1evVqNGzdW+vTpde7cOX3zzTcKCgqyW5ERHfXq1ZOzs7OaNGminj176t69ewoICFCWLFmi/PDkVR4jbdq0mjlzpt5++22VLVtWHTp0UPr06XXgwAE9ePBAX375pSSpdOnSWr58uQYNGqSyZcsqderUatKkSaz8fvzX3bt3lStXLrVq1Uo+Pj5KnTq1fv31V+3atctuJcezMkVl9uzZqlKlikqVKiVfX1/ly5dPZ86c0bp167R///7n5nnjjTf07bffRuvYdOmfJfMNGzbUwoULNXr0aGXMmFHOzs5auXKlateurSpVqqhr164qU6aM7ty5o6VLl2rv3r0aPHiw3XvFyclJq1evVp06dVStWjW1adNGlStXlpOTk44cOWKurvn3Zfc2bNiglClTqm7dui/MGZP3brt27TRs2DA1b95c77zzjh48eKD58+erUKFCMT55Zdu2bfXpp59q7NixKlasWKTLT0b3PTVhwgRt2bJFjRo1Up48eXTt2jXNmzdPuXLlUpUqVWKUCQBiTfyfWB8AEoenlz7btWtXpG3h4eFGgQIFjAIFCpiXRTt58qTRuXNnI1u2bIaTk5ORM2dOo3HjxsbKlSvt7nvz5k2jX79+Rs6cOQ1nZ2cjV65cRpcuXewuIRcWFmZ89NFHRtGiRQ0XFxcjffr0RunSpY3x48cbwcHB5n7/vWzdU3///bchyZBkbN26Ncrv7+rVq0bfvn0NDw8Pw8nJyciWLZtRu3Ztw9/f39zn6eXYvvnmmxi9dnfv3jXGjRtnFC1a1HBzczPSpEljVK5c2Vi0aFGky3Y9veTX1KlTjenTpxseHh6Gi4uLUbVqVePAgQORHjs6r/Pzfna3b982unbtamTKlMlInTq1Ub9+fSMoKCjK1zIgIMDInz+/4ejoaHcJu2ddtu6/r1NUlzMzDMOYPXu2kSdPHsPFxcUoV66csW3bNqN06dLG66+/Ho1X1zCePHliLFy40Khatarh7u5uODk5GXny5DG6du1qd1mwp5f4+u9ltp6+PqdPnzbH1qxZYxQvXtxwdXU18ubNa3z00UfG559/Hmm/PHnyRLpEWkwf4+m+lSpVMtzc3Iy0adMa5cqVM77++mtz+71794wOHToY6dKlMyTZXcIsur8fkp55KTr967J1oaGhxnvvvWf4+PgYadKkMVKlSmX4+PgY8+bNs7vPszI96+d8+PBho3nz5ka6dOkMV1dXo3Dhwsbo0aOjzPNve/fuNSRFuoxa9erVjaJFi0Z5n02bNkW6FJ9hGMa1a9eMQYMGGQULFjRcXFyMdOnSGXXq1DEvVReV27dvG2PGjDGKFStmpEyZ0nB1dTW8vb2NESNGGJcvX7bbt3z58kanTp1e+D09Fd33rmEYxi+//GJ4e3sbzs7ORuHChY3//e9/z7xs3fMuORgREWF4eHgYkoyJEydGuU903lMbN2403njjDSNHjhyGs7OzkSNHDqN9+/bG8ePHo/39A0BssxlGLJ2pBwCAl3DmzBnly5dPU6dO1ZAhQ6yOY4mIiAhlzpxZLVq0iHLZL5Kf2rVrK0eOHPrqq6+sjvJM+/fvV6lSpbR3794YnaQRABB7OIYeAIB49OjRo0jHUS9evFi3bt1SjRo1rAmFBOfDDz/U8uXLY3wSuPg0ZcoUtWrVijIPABbiGHoAAOLRn3/+qYEDB6p169bKmDGj9u7dq88++0ze3t5q3bq11fGQQJQvX15hYWFWx3iuZcuWWR0BAJI9Cj0AAPEob9688vDw0OzZs3Xr1i1lyJBBnTt31pQpU+Ts7Gx1PAAAkIhwDD0AAAAAAIkQx9ADAAAAAJAIUegBAAAAAEiEkt0x9BEREbp06ZLSpEkjm81mdRwAAAAAQBJnGIbu3r2rHDlyyMEh9ubVk12hv3Tpkjw8PKyOAQAAAABIZs6fP69cuXLF2uMlu0KfJk0aSf+8kGnTprU4DQAAAAAgqQsJCZGHh4fZR2NLsiv0T5fZp02blkIPAAAAAIg3sX3YNyfFAwAAAAAgEaLQAwAAAACQCFHoAQAAAABIhCj0AAAAAAAkQhR6AAAAAAASIQo9AAAAAACJEIUeAAAAAIBEiEIPAAAAAEAiRKEHAAAAACARotADAAAAAJAIUegBAAAAAEiEKPQAAAAAACRCFHoAAAAAABIhCj0AAAAAAIkQhR4AAAAAgESIQg8AAAAAQCJEoQcAAAAAIBGi0AMAAAAAkAhR6AEAAAAASIQo9AAAAAAAJEIUegAAAAAAEiEKPQAAAAAAiZClhX7Lli1q0qSJcuTIIZvNpu++++6F99m0aZNKlSolFxcXFSxYUIsWLYrznAAAAAAAJDSWFvr79+/Lx8dHc+fOjdb+p0+fVqNGjVSzZk3t379fAwYM0Ntvv62ff/45jpMCAAAAAJCwpLDyyRs0aKAGDRpEe38/Pz/ly5dP06dPlyR5enpq69atmjlzpurXrx9XMQEAAAAAeGlPnjyJk8dNVMfQ79ixQ3Xq1LEbq1+/vnbs2PHM+4SGhiokJMTuCwAAAACAuPb48WNNmTJF5cuXj5PHT1SF/sqVK8qaNavdWNasWRUSEqKHDx9GeZ/JkyfL3d3d/PLw8IiPqAAAAACAZOzPP/9U6dKlNWLECJ04cSJOniNRFfqXMWLECAUHB5tf58+ftzoSAAAAACCJCgkJUb9+/VSpUiUdOnRIkmSz2eLkuRJVoc+WLZuuXr1qN3b16lWlTZtWbm5uUd7HxcVFadOmtfsCAAAAACC2fffdd/Ly8tLcuXNlGIYkqWTJkvr999/j5PkSVaGvWLGiNm7caDe2YcMGVaxY0aJEAAAAAIDk7sKFC2revLmaN2+uixcvSpJSpkyp6dOna+fOnSpZsmScPK+lZ7m/d++e3bEEp0+f1v79+5UhQwblzp1bI0aM0MWLF7V48WJJUq9evTRnzhwNHTpU3bp102+//aYVK1Zo3bp1Vn0LAAAAAIBkzDAMNW7cWAcOHDDHGjRooHnz5ilv3rxx+tyWztDv3r1bJUuWND+tGDRokEqWLKkxY8ZIki5fvqxz586Z++fLl0/r1q3Thg0b5OPjo+nTp2vhwoVcsg4AAAAAYAmbzaaPPvpI0j8nbV+2bJnWrVsX52VekmzG04X9yURISIjc3d0VHBzM8fQAAAAAgBh58OCBQkJClC1bNrvxzz77TC1atFD69Okj3SeuemiiOoYeAAAAAACrbNiwQcWKFVOnTp3037nx7t27R1nm4xKFHgAAAACA57h+/brefPNN1atXT6dOndLGjRv1v//9z+pYFHoAAAAAAKJiGIYWLVqkIkWK2BX4atWqqWzZshYm+4elZ7kHAAAAACAhOn78uHr16mV3Dfn06dNr6tSp6tq1qxwcrJ8ftz4BAAAAAAAJRFhYmCZOnKjixYvblfn27dsrMDBQ3bt3TxBlXmKGHgAAAAAA044dOzR69Gjzdt68eTV//ny9/vrrFqaKWsL4WAEAAAAAgASgevXq6tSpkxwdHfXee+/p8OHDCbLMS1yH3uo4AAAAAACLGIah3377TbVq1ZLNZjPHr1+/rosXL6pEiRKx8jxchx4AAAAAgFhy7tw5NW3aVHXq1NGXX35pty1z5syxVubjEoUeAAAAAJBshIeHa9asWfLy8tIPP/wgSRo8eLDu3LljbbCXwEnxAAAAAADJwr59++Tr66vdu3ebY9mzZ9enn34qd3d3C5O9HGboAQAAAABJ2v379zVkyBCVLVvWrsz37t1bgYGBatmypd0x9IkFM/QAAAAAgCTrp59+Uu/evXX27FlzrGjRovL391elSpUsTPbqmKEHAAAAACRZy5YtM8u8i4uLJk6cqL179yb6Mi9x2Tqr4wAAAAAA4tCNGzdUpEgRFS9eXAsWLNBrr70W7xniqoey5B4AAAAAkCQEBQXp9OnTatCggTmWKVMm7dy5U/ny5UuUx8k/D0vuAQAAAACJWmhoqMaNGycfHx917NhR165ds9ueP3/+JFfmJQo9AAAAACAR27Jli0qUKKHx48crLCxMt2/f1uTJk62OFS8o9AAAAACAROf27dvq0aOHqlevrqCgIElSihQpNHz4cE2aNMnidPGDY+gBAAAAAImGYRhavny53n33Xbul9eXLl5e/v7+KFy9uYbr4xQw9AAAAACBRuHTpkho2bKj27dubZT5NmjT69NNPtW3btmRV5iVm6AEAAAAAiYSLi4v27Nlj3m7evLlmz56tXLlyWZjKOszQAwAAAAAShYwZM2rmzJnKmTOnvv32W61evTrZlnmJQg8AAAAASIDu3bun4cOH68qVK3bjHTp0UFBQkJo1a2ZNsASEJfcAAAAAgATlhx9+UJ8+fXT+/HmdPXtWX3/9tbnNZrMpderUFqZLOJihBwAAAAAkCJcvX1abNm3UpEkTnT9/XpL03Xff6cyZM9YGS6Ao9AAAAAAAS0VERMjPz0+enp765ptvzPG6devq8OHDyps3r3XhEjCW3AMAAAAALHPkyBH5+vpq+/bt5limTJk0c+ZMdezYUTabzcJ0CRsz9AAAAAAAS0yfPl0lS5a0K/NvvfWWgoKC1KlTJ8r8CzBDDwAAAACwRI4cOfT48WNJUsGCBbVgwQLVqlXL4lSJB4UeAAAAAGCJdu3aadmyZSpWrJhGjRolNzc3qyMlKhR6AAAAAECcMgxDS5Ys0fbt2zVv3jxz3Gaz6bvvvmNp/Uui0AMAAAAA4szJkyfVu3dvbdiwQZLUqFEjNWrUyNxOmX95nBQPAAAAABDrHj9+rI8++kje3t5mmZdk92+8GmboAQAAAACx6q+//pKvr68OHjxojnl4eGju3Llq0qSJhcmSFmboAQAAAACxIiQkRP3791fFihXNMu/g4KABAwbo6NGjlPlYxgw9AAAAAOCVXb58WWXLltXFixfNsRIlSiggIEBlypSxMFnSxQw9AAAAAOCVZcuWTT4+PpKklClTaurUqdq1axdlPg5R6AEAAAAAMRYREWF322azad68eWrevLkOHz6sIUOGKEUKFoXHJQo9AAAAACBGDh48qEqVKmnNmjV243ny5NHq1auVL18+i5IlLxR6AAAAAEC0PHz4UCNGjFDp0qX1119/qW/fvrp7967VsZItCj0AAAAA4IU2bNggb29vTZkyRU+ePJEkpUqVyu4keIhfFHoAAAAAwDNdv35dnTt3Vr169XTq1ClJkrOzs8aOHasDBw6oSJEiFidMvjhDAQAAAAAgEsMwtHjxYg0ePFg3b940x6tWraoFCxbI09PTwnSQmKEHAAAAAERh3Lhxeuutt8wyny5dOgUEBGjTpk2U+QSCQg8AAAAAiKR79+5KlSqVJKldu3YKDAzU22+/LQcHamRCwZJ7AAAAAIDu3r2rNGnSmLdz586tefPmKXPmzGrQoIGFyfAsfLQCAAAAAMlYcHCw+vTpo6JFiyokJMRuW+fOnSnzCRiFHgAAAACSIcMwtGrVKnl6emr+/Pk6f/68Ro0aZXUsxABL7gEAAAAgmTl//rz69u2rtWvXmmOpUqVSwYIFLUyFmKLQAwAAAEAyER4erjlz5mjUqFG6f/++Od6oUSPNnTtXefLksTAdYopCDwAAAADJwL59++Tr66vdu3ebY9myZdPs2bPVqlUr2Ww2C9PhZVDoAQAAACCJu3fvnmrVqqU7d+6YYz179tSUKVOULl06y3Lh1XBSPAAAAABI4lKnTq0JEyZIkry8vPTHH3/Iz8+PMp/IMUMPAAAAAEnM1atX5ebmprRp05pjffr0kYuLi9566y05OztbmA6xhRl6AAAAAEgiDMPQZ599Jk9PT40YMcJum6Ojo3x9fSnzSQiFHgAAAACSgGPHjqlmzZp6++23dfv2bc2fP187duywOhbiEIUeAAAAABKx0NBQTZgwQcWLF9fmzZvN8Y4dO3Jd+SSOY+gBAAAAIJH6448/5Ovrq6CgIHMsf/788vPzU926dS1MhvjADD0AAAAAJDK3b9+Wr6+vqlWrZpZ5R0dHDR8+XIcOHaLMJxPM0AMAAABAIvPNN98oICDAvF2uXDkFBASoePHiFqZCfGOGHgAAAAASme7du6tChQpKnTq1Pv30U23fvp0ynwwxQw8AAAAACdiTJ0+0adMm1alTxxxzdHTU4sWL5ebmply5clmYDlZihh4AAAAAEqg9e/aofPnyqlu3rrZt22a37bXXXqPMJ3MUegAAAABIYO7du6dBgwapXLly2rt3rySpV69eioiIsDgZEhKW3AMAAABAArJu3Tr16dNH586dM8e8vb0VEBAgBwfmZPF/eDcAAAAAQAJw5coVtW3bVo0bNzbLvKurqyZPnqy9e/eqQoUKFidEQsMMPQAAAABYKCIiQgsXLtTQoUMVHBxsjtepU0d+fn4qUKCAhemQkDFDDwAAAAAWW7RokVnmM2XKpK+++kq//PILZR7PRaEHAAAAAAs5ODjI399fTk5OeuuttxQYGKhOnTrJZrNZHQ0JHEvuAQAAACAebdq0Sa6urnbHxHt7e+v48ePKmzevdcGQ6DBDDwAAAADx4NatW+revbtq1qyprl27KjQ01G47ZR4xRaEHAAAAgDhkGIaWLFmiIkWK6PPPP5ckBQUFafHixRYnQ2JHoQcAAACAOHLq1Cm9/vrr6tSpk65fvy5JSps2rebPn6/u3btbnA6JHYUeAAAAAGLZ48eP9dFHH8nb21u//PKLOd6yZUsFBgaqV69ecnCgjuHVcFI8AAAAAIhFBw4cUOfOnXXw4EFzLFeuXJo7d66aNm1qYTIkNXwkBAAAAACxyMnJSYGBgZIkm82md999V0ePHqXMI9ZR6AEAAAAgFnl5eWn48OHy8fHRX3/9pVmzZilNmjRWx0ISRKEHAAAAgJd08eJFvfPOO5EuQff+++9r165dKlu2rEXJkBxQ6AEAAAAghsLDwzV37lx5enrq008/1eTJk+22Ozs7y8nJyaJ0SC4o9AAAAAAQA4cOHVKVKlXUr18/3b17V5L0+eef69GjRxYnQ3JDoQcAAACAaHj48KFGjhypUqVK6c8//zTHu3fvrv3798vV1dXCdEiOuGwdAAAAALzAxo0b1bNnT508edIcK1y4sBYsWKDq1atbmAzJGTP0AAAAAPAMhmHI19dXderUMcu8k5OTxo4dqwMHDlDmYSlm6AEAAADgGWw2m3LkyGHerlKlivz9/eXp6WlhKuAfzNADAAAAwHOMGDFCFSpUkL+/vzZv3kyZR4LBDD0AAAAASAoLC9O0adNkGIZGjRpljru4uGj79u2y2WwWpgMio9ADAAAASPa2b98uX19fHTlyRE5OTmrWrJmKFi1qbqfMIyFiyT0AAACAZCs4OFh9+vRRlSpVdOTIEUlSeHi4/vjjD4uTAS/GDD0AAACAZMcwDK1evVr9+/fX5cuXzfFSpUrJ399fpUuXtjAdED3M0AMAAABIVs6fP69mzZqpVatWZplPlSqVZsyYob/++osyj0SDGXoAAAAAycbOnTtVu3Zt3bt3zxxr1KiR5s6dqzx58liYDIg5ZugBAAAAJBslSpSQh4eHJClbtmxasWKF1q5dS5lHokShBwAAAJBkRURE2N12dnaWv7+/evbsqcDAQLVu3Zoz2CPRotADAAAASJJ+/vlneXp66tChQ3bjVapUkZ+fn9KlS2dNMCCWUOgBAAAAJCnXrl1Tx44d9frrr+v48ePq2bNnpJl6ICmg0AMAAABIEgzD0Oeff64iRYpo6dKl5rizs7Pu3LljXTAgjlDoAQAAACR6x44dU61atdS9e3fdvn1bkpQ+fXp99tln+v3335UhQwaLEwKxj0IPAAAAINEKDQ3VhAkTVLx4cW3atMkc79ixo4KCgtStWzdOeocki+vQAwAAAEi0OnbsqFWrVpm38+XLp/nz56t+/foWpgLiBzP0AAAAABKtQYMGSZIcHR01dOhQHT58mDKPZIMZegAAAACJgmEYCgkJkbu7uzlWqVIlzZgxQ7Vq1ZKPj4+F6YD4R6EHAAAAkOCdPXtWffv21Y0bN7Rt2zY5Ojqa2wYOHGhhMsA6LLkHAAAAkGA9efJEM2bMkJeXl9atW6e//vpL8+fPtzoWkCAwQw8AAAAgQdq7d6969OihvXv3mmM5cuRQ7ty5LUwFJBzM0AMAAABIUO7du6fBgwerbNmyZpm32Wzq27evjh49qqZNm1qcEEgYLC/0c+fOVd68eeXq6qry5ctr586dz91/1qxZKly4sNzc3OTh4aGBAwfq0aNH8ZQWAAAAQFz68ccf5e3trRkzZigiIkKS5O3tre3bt2vOnDl2J8QDkjtLC/3y5cs1aNAgjR07Vnv37pWPj4/q16+va9euRbn/0qVLNXz4cI0dO1aBgYH67LPPtHz5co0cOTKekwMAAACIbX///bcaN26ss2fPSpJcXV314Ycfau/evapQoYLF6YCEx9JCP2PGDPXo0UNdu3aVl5eX/Pz8lDJlSn3++edR7r99+3ZVrlxZHTp0UN68eVWvXj21b9/+hbP6AAAAABK+1157TX369JEk1a5dW4cOHdKIESPk5ORkcTIgYbKs0IeFhWnPnj2qU6fO/4VxcFCdOnW0Y8eOKO9TqVIl7dmzxyzwp06d0o8//qiGDRs+83lCQ0MVEhJi9wUAAADAen///bfCw8Ptxj788EMtWbJEGzZsUMGCBS1KBiQOlhX6GzduKDw8XFmzZrUbz5o1q65cuRLlfTp06KAJEyaoSpUqcnJyUoECBVSjRo3nLrmfPHmy3N3dzS8PD49Y/T4AAAAAxMyjR480duxYFS1aVHPnzrXbljZtWnXo0EE2m82idEDiYflJ8WJi06ZN+vDDDzVv3jzt3btXq1ev1rp16/TBBx888z4jRoxQcHCw+XX+/Pl4TAwAAADg3zZv3iwfHx9NmDBBjx8/1qhRo/gbHXhJll2HPlOmTHJ0dNTVq1ftxq9evaps2bJFeZ/Ro0frzTff1Ntvvy1JKlasmO7fvy9fX1+NGjVKDg6RP59wcXGRi4tL7H8DAAAAAKLt1q1beu+99+zOl5UiRQq98847ypQpk4XJgMTLshl6Z2dnlS5dWhs3bjTHIiIitHHjRlWsWDHK+zx48CBSaXd0dJQkGYYRd2EBAAAAvBTDMLR06VJ5enralfkKFSpo3759mjRpktzc3CxMCCRels3QS9KgQYPUpUsXlSlTRuXKldOsWbN0//59de3aVZLUuXNn5cyZU5MnT5YkNWnSRDNmzFDJkiVVvnx5nThxQqNHj1aTJk3MYg8AAAAgYTh9+rR69+6tn3/+2RxLmzatJk+erF69ekW5whZA9Fla6Nu2bavr169rzJgxunLlikqUKKH169ebJ8o7d+6c3S/5+++/L5vNpvfff18XL15U5syZ1aRJE02aNMmqbwEAAADAM8yePduuzLdo0UKzZ89Wzpw5LUwFJB02I5mtVQ8JCZG7u7uCg4OVNm1aq+MAAAAASdbdu3fl5eUlwzA0d+5cvfHGG1ZHAiwRVz3U0hl6AAAAAEnD3bt3tWfPHtWoUcMcS5MmjdauXasCBQooTZo01oUDkigOWgEAAADwStasWSMvLy81btxY586ds9tWokQJyjwQRyj0AAAAAF7KpUuX1KpVK73xxhu6cOGC7t+/r0GDBlkdC0g2KPQAAAAAYiQiIkLz58+Xp6enVq1aZY7Xr19fU6dOtTAZkLxwDD0AAACAaDt8+LB8fX21Y8cOcyxz5syaNWuW2rdvL5vNZmE6IHlhhh4AAADACz18+FCjRo1SyZIl7cp8t27dFBQUpA4dOlDmgXjGDD0AAACAF3ry5Im++uorPXnyRJJUqFAhLViwwO6s9gDiFzP0AAAAAF4oTZo0mjt3rpycnDR69GgdOHCAMg9YjBl6AAAAAHYMw9BXX32latWqKW/evOZ4kyZNdPLkSXl4eFgXDoCJGXoAAAAAphMnTqhu3brq0qWL+vTpI8Mw7LZT5oGEg0IPAAAAQI8fP9bkyZNVrFgxbdy4UZL0008/adu2bRYnA/AsLLkHAAAAkrkdO3bI19dXhw8fNsdy586tefPmqUqVKhYmA/A8zNADAAAAyVRwcLD69u2rypUrm2XewcFBAwcO1JEjR9SoUSOLEwJ4HmboAQAAgGRo/fr16t69uy5dumSOlSxZUgEBASpdurSFyQBEFzP0AAAAQDIUERFhlvmUKVNq+vTp2rlzJ2UeSESYoQcAAACSoYYNG6pNmza6d++e5s6da3d5OgCJA4UeAAAASOIOHDigr776SlOnTpXNZjPHFy1aJFdXV7sxAIkHS+4BAACAJOrBgwcaNmyYSpcurenTp+vrr7+22+7m5kaZBxIxCj0AAACQBP3yyy/y9vbWxx9/rPDwcEmSv7+/DMOwOBmA2EKhBwAAAJKQa9euqVOnTqpfv75Onz4tSXJ2dtb48eP1888/MyMPJCEcQw8AAAAkAYZhaNGiRRoyZIhu3bpljlerVk3+/v4qXLiwhekAxAUKPQAAAJDIPXz4UA0bNtSmTZvMsfTp02vq1Knq2rWrHBxYmAskRRR6AAAAIJFzc3NTtmzZzNvt27fXzJkzlTVrVgtTAYhrFHoAAAAgCZg1a5aOHz+uSZMm6fXXX7c6DoB4wNobAAAAIBG5c+eOevXqpSVLltiNZ82aVbt376bMA8kIhR4AAABIBAzD0DfffCNPT08tWLBAAwYM0M2bN+324Qz2QPJCoQcAAAASuLNnz6pJkyZq06aNrly5Ikl69OiR9u7da3EyAFai0AMAAAAJVHh4uGbNmqWiRYtq3bp15njTpk119OhR1a1b18J0AKzGSfEAAACABGjfvn3q0aOH9uzZY45lz55dc+bMUfPmzVleD4AZegAAACChWbZsmcqWLWuWeZvNpj59+igwMFAtWrSgzAOQxAw9AAAAkODUqlVL7u7uunXrlry9veXv76+KFStaHQtAAkOhBwAAACwWHh4uR0dH83aWLFn0ySef6Ny5cxoyZIicnZ0tTAcgoWLJPQAAAGCRiIgIBQQEyNPTUzdu3LDb1qlTJ40cOZIyD+CZKPQAAACABQIDA1W9enX5+vrq77//1uDBg62OBCCRodADAAAA8Sg0NFTjxo2Tj4+Ptm7darftyZMnFqUCkBhxDD0AAAAQTzZv3qyePXvq2LFj5liBAgXk5+enOnXqWJgMQGLEDD0AAAAQx27duqW3335bNWrUMMt8ihQpNHLkSB06dIgyD+ClMEMPAAAAxKGIiAhVrVpVR48eNccqVKggf39/FStWzMJkABI7ZugBAACAOOTg4KChQ4dKktKkSaO5c+dq27ZtlHkAr4wZegAAACAWPXnyRA8ePFDatGnNsc6dO+vs2bPq3r27cubMaWE6AEkJM/QAAABALNm1a5fKli2rPn362I3bbDaNGTOGMg8gVlHoAQAAgFd09+5dDRgwQBUqVND+/fu1ZMkSbdiwwepYAJI4ltwDAAAAr2Dt2rXq27evzp8/b44VL15cGTJksDAVgOSAGXoAAADgJVy+fFmtW7dW06ZNzTLv5uamjz76SLt371bp0qUtTgggqWOGHgAAAIiBiIgI+fv7a9iwYQoJCTHH69Wrp/nz5yt//vwWpgOQnFDoAQAAgBj48ccf1bt3b/N25syZNXPmTHXo0EE2m83CZACSG5bcAwAAADHQqFEj1alTR5LUtWtXBQYGqmPHjpR5APGOGXoAAADgOY4cOaKiRYuat202m/z8/HTu3DnVrFnTwmQAkjtm6AEAAIAo3Lx5U127dpW3t7fWr19vt61AgQKUeQCWo9ADAAAA/2IYhv73v/+pSJEiWrRokSSpd+/eevDggbXBAOA/WHIPAAAA/H8nT55U7969tWHDBnPM3d1dw4cPl6urq4XJACAyZugBAACQ7D1+/FhTpkyRt7e3XZlv06aNAgMD1bNnTzk48KczgISFGXoAAAAka3/++ad8fX116NAhc8zDw0Pz5s1T48aNLUwGAM/Hx4wAAABI1iZMmGCWeQcHBw0cOFBHjx6lzANI8JihBwAAQLI2d+5cFS1aVEWKFFFAQIBKly5tdSQAiBYKPQAAAJKNCxcu6NKlSypXrpw5li9fPm3evFklS5ZUihT8eQwg8WDJPQAAAJK88PBwzZkzR15eXmrTpo3u379vt71s2bKUeQCJDoUeAAAASdrBgwdVuXJl9e/fX3fv3tXZs2c1ZcoUq2MBwCuj0AMAACBJevDggYYPH67SpUvrr7/+Msd79OihQYMGWZgMAGIH64oAAACQ5GzYsEG9evXSqVOnzLEiRYrI399fVatWtTAZAMQeZugBAACQZFy/fl1vvvmm6tWrZ5Z5Z2dnjRs3Tvv376fMA0hSmKEHAABAknH//n2tXr3avF2tWjUtWLBARYoUsTAVAMQNZugBAACQZOTNm1fjx49XunTptHDhQv3++++UeQBJFoUeAAAAiVJYWJhmzJihe/fu2Y0PGDBAx44dU/fu3eXgwJ+7AJIultwDAAAg0dm2bZt8fX119OhRnT9/XjNnzjS3pUiRQlmyZLEwHQDEDz6yBAAAQKJx584d9e7dW1WqVNHRo0clSfPmzdPly5ctTgYA8Y9CDwAAgATPMAx988038vT0lJ+fnzleunRp/fnnn8qePbuF6QDAGhR6AAAAJGjnzp1T06ZN1aZNG125ckWSlCpVKs2aNUt//fWXSpYsaXFCALAGx9ADAAAgwfLz89OQIUN0//59c6xx48aaO3eucufObWEyALAeM/QAAABIsB4+fGiW+WzZsumbb77RmjVrKPMAIMlmGIZhdYj4FBISInd3dwUHBytt2rRWxwEAAMBzPHnyRBUrVlSZMmU0efJkpUuXzupIABBjcdVDWXIPAACABOGnn37S/v37NWLECHMsRYoU2rp1q1xcXCxMBgAJE4UeAAAAlrp69aoGDBigZcuWyWazqXbt2ipXrpy5nTIPAFHjGHoAAABYIiIiQgsXLlSRIkW0bNkySf9cnu7LL7+0OBkAJA7M0AMAACDeBQUFqWfPntqyZYs5liFDBk2fPl1dunSxMBkAJB7M0AMAACDehIaGaty4cfLx8bEr82+++aaCgoL01ltvyWazWZgQABIPZugBAAAQL86fP6969eopKCjIHMufP7/8/PxUt25dC5MBQOLEDD0AAADiRY4cOZQ6dWpJ/5y9fvjw4Tp06BBlHgBeEoUeAAAA8cLR0VEBAQGqXLmy9uzZo8mTJytlypRWxwKARItCDwAAgFh3+vRpNW7cWH/++afdeIkSJfTHH3+oePHiFiUDgKSDY+gBAAAQa548eaJZs2Zp7NixevDggc6dO6c9e/bIycnJ3IeT3gFA7GCGHgAAALFi9+7dKleunN577z09ePBAknTr1i2dOnXK4mQAkDRR6AEAAPBK7t27p4EDB6p8+fLat2+fpH9m4fv376+jR4+qcOHCFicEgKSJJfcAAAB4aT/88IP69Omj8+fPm2PFihVTQECAypcvb2EyAEj6mKEHAADASxk3bpyaNGlilnlXV1dNmTJFe/bsocwDQDyg0AMAAOCltGjRQo6OjpKkunXr6vDhwxo2bJjdCfAAAHGHJfcAAACIlidPnihFiv/787F48eKaOHGiPDw81KFDB85eDwDxzGYYhmF1iPgUEhIid3d3BQcHK23atFbHAQAASPAePXqkSZMmad26dfrzzz/l7OxsdSQASFTiqoey5B4AAADP9Pvvv5sz8fv27dO0adOsjgQA+P8o9AAAAIjk5s2b6tatm2rVqqW///5bkuTk5KSIiAiLkwEAnuIYegAAAJgMw9CSJUs0cOBA3bhxwxyvVKmS/P39VbRoUQvTAQD+jRl6AAAASJJOnjyp+vXr68033zTLvLu7u/z8/PTHH39Q5gEggWGGHgAAALpz545KlSqlkJAQc6x169b65JNPlD17dguTAQCehRl6AAAAKF26dOrbt68kycPDQ2vWrNGKFSso8wCQgL3SDP2jR4/k6uoaW1kAAAAQT0JCQuTq6mp3CbrRo0fL1dVVgwYNUurUqS1MBwCIjhjP0EdEROiDDz5Qzpw5lTp1ap06dUrSP/8H8Nlnn8V6QAAAAMSu7777Tl5eXvr444/txt3c3DRmzBjKPAAkEjEu9BMnTtSiRYv08ccf232i6+3trYULF8ZqOAAAAMSeixcvqkWLFmrevLkuXryoDz74QMeOHbM6FgDgJcW40C9evFj+/v7q2LGjHB0dzXEfHx8FBQXFajgAAAC8uvDwcM2dO1eenp769ttvzfFatWpx+CQAJGIxPob+4sWLKliwYKTxiIgIPX78OFZCAQAAIHYcOnRIvr6++vPPP82xLFmy6JNPPlHbtm1ls9ksTAcAeBUxnqH38vLSH3/8EWl85cqVKlmyZKyEAgAAwKt5+PChRo4cqVKlStmV+bfffluBgYFq164dZR4AErkYz9CPGTNGXbp00cWLFxUREaHVq1fr2LFjWrx4sX744Ye4yAgAAIAYmjNnjiZPnmzeLly4sPz9/VWtWjULUwEAYlOMZ+jfeOMNrV27Vr/++qtSpUqlMWPGKDAwUGvXrlXdunXjIiMAAABiqH///nrttdfk7OyscePG6cCBA5R5AEhibIZhGFaHiE8hISFyd3dXcHCw0qZNa3UcAACAV2YYhg4dOqTixYvbje/cuVNp0qSRp6enRckAAFLc9dAYz9Dnz59fN2/ejDR+584d5c+fP1ZCAQAAIHr+/vtv1alTR2XLlo10xaFy5cpR5gEgCYtxoT9z5ozCw8MjjYeGhurixYuxEgoAAADPFxYWpg8//FDFihXTb7/9prCwMPXs2VPJbPElACRr0T4p3po1a8x///zzz3J3dzdvh4eHa+PGjcqbN2+shgMAAEBk27dvl6+vr44cOWKO5cmTR8OHD+fM9QCQjES70Ddr1kySZLPZ1KVLF7ttTk5Oyps3r6ZPnx6r4QAAAPB/7ty5oxEjRmjBggXmTLyDg4MGDhyo8ePHK1WqVBYnBADEp2gvuY+IiFBERIRy586ta9eumbcjIiIUGhqqY8eOqXHjxjEOMHfuXOXNm1eurq4qX768du7c+dz979y5o759+yp79uxycXFRoUKF9OOPP8b4eQEAABILwzC0cuVKeXl5yc/PzyzzpUuX1q5duzRt2jTKPAAkQzG+Dv3p06dj7cmXL1+uQYMGyc/PT+XLl9esWbNUv359HTt2TFmyZIm0f1hYmOrWrassWbJo5cqVypkzp86ePat06dLFWiYAAICE5vHjxxo1apQuX74sSUqVKpUmTpyofv36KUWKGP85BwBIIl7qsnX379/X5s2bde7cOYWFhdlte+edd6L9OOXLl1fZsmU1Z84cSf+sAvDw8FD//v01fPjwSPv7+flp6tSpCgoKkpOTU0xjS+KydQAAIHHavHmzatSooUaNGmnu3LnKkyeP1ZEAANEUVz00xoV+3759atiwoR48eKD79+8rQ4YMunHjhlKmTKksWbLo1KlT0XqcsLAwpUyZUitXrjSPz5ekLl266M6dO/r+++8j3adhw4bKkCGDUqZMqe+//16ZM2dWhw4dNGzYMDk6Okb5PKGhoQoNDTVvh4SEyMPDg0IPAAASrH379illypQqXLiw3fiuXbtUpkwZTnwHAIlMgrkO/cCBA9WkSRPdvn1bbm5u+vPPP3X27FmVLl1a06ZNi/bj3LhxQ+Hh4cqaNavdeNasWXXlypUo73Pq1CmtXLlS4eHh+vHHHzV69GhNnz5dEydOfObzTJ48We7u7uaXh4dHtDMCAADEp/v37+u9995T2bJl9fbbbysiIsJue9myZSnzAABTjAv9/v37NXjwYDk4OMjR0VGhoaHy8PDQxx9/rJEjR8ZFRlNERISyZMkif39/lS5dWm3bttWoUaPk5+f3zPuMGDFCwcHB5tf58+fjNCMAAMDLWL9+vby9vTVt2jSFh4dr69atWrZsmdWxAAAJWIzPouLk5CQHh38+B8iSJYvOnTsnT09Pubu7x6gsZ8qUSY6Ojrp69ard+NWrV5UtW7Yo75M9e3Y5OTnZLa/39PTUlStXFBYWJmdn50j3cXFxkYuLS7RzAQAAxKerV69q4MCB+vrrr80xFxcXvf/++2rVqpWFyQAACV2MZ+hLliypXbt2SZKqV6+uMWPGaMmSJRowYIC8vb2j/TjOzs4qXbq0Nm7caI5FRERo48aNqlixYpT3qVy5sk6cOGG3/Oz48ePKnj17lGUeAAAgoTIMQ5999pk8PT3tynyNGjV08OBBvf/++/x9AwB4rhgX+g8//FDZs2eXJE2aNEnp06dX7969df36dS1YsCBGjzVo0CAFBAToyy+/VGBgoHr37q379++ra9eukqTOnTtrxIgR5v69e/fWrVu39O677+r48eNat26dPvzwQ/Xt2zem3wYAAIBljh8/rpo1a+rtt9/W7du3JUkZMmTQF198od9++02FChWyOCEAIDGI8ZL7MmXKmP/OkiWL1q9f/9JP3rZtW12/fl1jxozRlStXVKJECa1fv948Ud65c+fM5f2S5OHhoZ9//lkDBw5U8eLFlTNnTr377rsaNmzYS2cAAACIb1evXtXmzZvN2x07dtSMGTOUJUsWC1MBABKbl7oOfVT27t2rMWPG6IcffoiNh4szXIceAAAkBL6+vvr111/l5+enevXqWR0HABCHEsRl637++WcNGTJEI0eONK83HxQUpGbNmqls2bKRLq0CAACQ3N2+fVtTpkyJ9HfStGnTdPjwYco8AOClRXvJ/WeffaYePXooQ4YMun37thYuXKgZM2aof//+atu2rQ4fPixPT8+4zAoAAJBoGIahFStW6N1339XVq1eVLl069erVy9zOSkEAwKuK9pL74sWL680339R7772nVatWqXXr1qpQoYJWrFihXLlyxXXOWMOSewAAENfOnDmjPn366KeffjLHcuXKpZMnT3LmegBIhixfcn/y5Em1bt1aktSiRQulSJFCU6dOTVRlHgAAIC49efJE06dPV9GiRe3K/BtvvKHt27dT5gEAsSraS+4fPnyolClTSpJsNptcXFzMy9cBAAAkd3v27FGPHj20b98+cyxHjhyaM2eOmjdvbmEyAEBSFaPL1i1cuFCpU6eW9M8n0IsWLVKmTJns9nnnnXdiLx0AAEACZxiG3nvvPc2cOdM88Z3NZlOfPn00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yMPDw+pYAAAgiYlxoXd3d7e77eDgoMKFC2vChAmqV69erAUDACCxuHz5srJnz27eTpEihRYuXKizZ8+qefPmz706DAAAwMuK0TH04eHh2rZtm4oVK6b06dPHZa44wzH0AIDYcu/ePY0dO1Zz5szR9u3bVbp0aasjAQCABCiueqhDTHZ2dHRUvXr1dOfOnVgLAABAYvTjjz/K29tbM2bMUFhYmHx9ffXkyROrYwEAgGQkRoVekry9vXXq1Km4yAIAQIJ35coVtWvXTo0aNdLZs2clSS4uLmrRooVi6cIxAAAA0RLjQj9x4kQNGTJEP/zwgy5fvqyQkBC7LwAAkqKIiAgFBATI09NTy5cvN8dr1aqlQ4cOadSoUXJycrIwIQAASG6ifQz9hAkTNHjwYKVJk+b/7vyvk/wYhiGbzabw8PDYTxmLOIYeABBTgYGB8vX11datW82xjBkzavr06ercuTMnvQMAAM8VVz002oXe0dFRly9fVmBg4HP3q169eqwEiysUegBATBiGoUqVKunPP/80x958801Nnz5dmTNntjAZAABILOKqh0b7snVPe39CL+wAAMQmm82mOXPmqFy5csqXL5/8/PxUp04dq2MBAADE7Dr0LCkEACR1t27d0o0bN1SoUCFzrHTp0lqzZo1q1aolNzc3C9MBAAD8nxgV+kKFCr2w1N+6deuVAgEAYAXDMLRs2TINGDBAOXLk0K5du5Qixf/932SjRo0sTAcAABBZjAr9+PHj5e7uHldZAACwxOnTp9W7d2/9/PPPkqRr165p9uzZGjRokMXJAAAAni1Ghb5du3bKkiVLXGUBACBePXnyRDNnztTYsWP18OFDc7x58+Zq27athckAAABeLNqFnuPnAQBJya5du+Tr66v9+/ebYzlz5tScOXPUrFkzy3IBAABEl0N0d4zm1e0AAEjQ7t69qwEDBqhChQpmmbfZbOrfv7+OHj1KmQcAAIlGtGfoIyIi4jIHAADx4uTJk5ozZ475/2vFihVTQECAypcvb3EyAACAmIn2DD0AAElBiRIlNGDAALm6umrKlCnas2cPZR4AACRKNiOZraUPCQmRu7u7goODlTZtWqvjAADiUEREhL7++mu1adNGTk5O5vj9+/d15coVFShQwMJ0AAAguYirHsoMPQAgSTpy5IiqVq2qTp06aebMmXbbUqVKRZkHAACJHoUeAJCkPHr0SO+//75Kliyp7du3S5LGjx+vGzduWJwMAAAgdsXoOvQAACRkv/32m3r27KkTJ06YY6+99poWLFigTJkyWZgMAAAg9iWIGfq5c+cqb968cnV1Vfny5bVz585o3W/ZsmWy2WxcYggAkrmbN2+qa9euql27tlnmnZycNHr0aB08eFA1a9a0OCEAAEDss7zQL1++XIMGDdLYsWO1d+9e+fj4qH79+rp27dpz73fmzBkNGTJEVatWjaekAICEaOnSpSpSpIgWLVpkjlWuXFn79+/XhAkT5Orqal04AACAOGR5oZ8xY4Z69Oihrl27ysvLS35+fkqZMqU+//zzZ94nPDxcHTt21Pjx45U/f/54TAsASGgOHDhgHh/v7u4uPz8/bdmyRV5eXhYnAwAAiFuWFvqwsDDt2bNHderUMcccHBxUp04d7dix45n3mzBhgrJkyaLu3bu/8DlCQ0MVEhJi9wUASDrGjh2rfPnyqU2bNgoMDFTPnj3l4GD559UAAABxztKT4t24cUPh4eHKmjWr3XjWrFkVFBQU5X22bt2qzz77TPv374/Wc0yePFnjx49/1agAgATgzz//VFBQkN566y1zLGXKlNq9e7cyZMhgXTAAAAALJKopjLt37+rNN99UQEBAtM9WPGLECAUHB5tf58+fj+OUAIDYFhISon79+qlSpUrq3bu33VnsJVHmAQBAsmTpDH2mTJnk6Oioq1ev2o1fvXpV2bJli7T/yZMndebMGTVp0sQci4iIkCSlSJFCx44dU4ECBezu4+LiIhcXlzhIDwCID99++6369++vixcvSvrnOvOzZs3SnDlzLE4GAABgLUtn6J2dnVW6dGlt3LjRHIuIiNDGjRtVsWLFSPsXKVJEhw4d0v79+82vpk2bqmbNmtq/f788PDziMz4AIA5duHBBzZs3V4sWLcwynzJlSk2bNk2zZs2yNhwAAEACYOkMvSQNGjRIXbp0UZkyZVSuXDnNmjVL9+/fV9euXSVJnTt3Vs6cOTV58mS5urrK29vb7v7p0qWTpEjjAIDEKTw8XPPnz9fIkSN19+5dc7xBgwaaN2+e8ubNa104AACABMTyQt+2bVtdv35dY8aM0ZUrV1SiRAmtX7/ePFHeuXPnOFsxACQT58+fV+vWrfXXX3+ZY1mzZtUnn3yiNm3ayGazWZgOAAAgYbEZhmFYHSI+hYSEyN3dXcHBwUqbNq3VcQAA//Lw4UN5e3vr1KlTkqQePXroo48+Uvr06S1OBgAA8PLiqocy9Q0ASDDc3Nzk5+cnT09PbdmyRf7+/pR5AACAZ6DQAwAscf36dXXt2lXHjx+3G69bt64OHjyoqlWrWpQMAAAgcbD8GHoAQPJiGIa+/PJLDR48WLdu3dLZs2e1ceNGu+PjU6Tg/54AAABehBl6AEC8OX78uGrXrq2uXbvq1q1bkqT9+/fr5MmTFicDAABIfCj0AIA4FxYWpokTJ6p48eL6/fffzfH27dsrMDBQBQsWtDAdAABA4sSaRgBAnNq2bZt8fX119OhRcyxv3ryaP3++Xn/9dQuTAQAAJG7M0AMA4szEiRNVpUoVs8w7OjpqyJAhOnz4MGUeAADgFTFDDwCIMxUrVjT/XaZMGQUEBKhEiRLWBQIAAEhCKPQAgFhjGIbd2epr166tvn376rXXXlO/fv3k6OhoYToAAICkhUIPAHhl4eHh+vTTT7Vx40atWbPGrtTPmTPHwmQAAABJF8fQAwBeyb59+1ShQgUNHDhQP/zwgxYtWmR1JAAAgGSBQg8AeCn379/XkCFDVLZsWe3evdscP378uIWpAAAAkg+W3AMAYuynn35S7969dfbsWXOsaNGi8vf3V6VKlSxMBgAAkHwwQw8AiLarV6+qffv2atiwoVnmXVxcNHHiRO3du5cyDwAAEI+YoQcARMv169fl6emp27dvm2M1a9bUggUL9Nprr1mYDAAAIHlihh4AEC2ZM2dWs2bNJEkZMmTQokWLtHHjRso8AACARZihBwBEKTQ0VE5OTnJw+L/PfqdOnSpXV1eNHz9emTNntjAdAAAAmKEHAESyZcsWlShRQl988YXdeMaMGTVv3jzKPAAAQAJAoQcAmG7fvq0ePXqoevXqCgoK0pAhQ3T16lWrYwEAACAKFHoAgAzD0LJly+Tp6amFCxea44ULF9bdu3ctTAYAAIBnodADQDJ35swZNWrUSO3btzdn49OkSaNPP/1U27ZtU8GCBS1OCAAAgKhQ6AEgmXry5ImmTZumokWL6qeffjLHmzdvrqNHj6pfv35ydHS0MCEAAACeh7PcA0AyNWnSJI0bN868nTNnTs2ZM8e8NB0AAAASNmboASCZ6t+/v7JkySKbzaZ+/frp6NGjlHkAAIBEhBl6AEgmLly4oFy5cpm3M2TIoEWLFilDhgwqX768hckAAADwMpihB4Ak7vLly2rdurW8vb11+fJlu20NGjSgzAMAACRSFHoASKIiIiLk5+enIkWKaOXKlQoODtaAAQOsjgUAAIBYwpJ7AEiCjhw5Il9fX23fvt0cy5Qpk5o0aSLDMGSz2SxMBwAAgNjADD0AJCGPHj3S6NGjVbJkSbsy/9ZbbykoKEidOnWizAMAACQRzNADQBLx+++/q2fPnvr777/NsYIFC2rBggWqVauWhckAAAAQF5ihB4Ak4OHDh+rQoYNZ5lOkSKFRo0bp4MGDlHkAAIAkikIPAEmAm5ubZs2aJUmqVKmS9u/fr4kTJ8rNzc3aYAAAAIgzLLkHgETo5MmTSpkypbJnz26OtWnTRilTplSjRo3k4MDntQAAAEkdf/EBQCLy+PFjffTRR/L29lb//v3tttlsNjVp0oQyDwAAkEzwVx8AJBJ//fWXypQpo+HDh+vRo0datWqVfvzxR6tjAQAAwCIUegBI4EJCQtS/f39VrFhRBw8elCQ5ODhowIABqlatmsXpAAAAYBWOoQeABOy7775Tv379dPHiRXOsRIkSCggIUJkyZSxMBgAAAKsxQw8ACdDFixfVokULNW/e3CzzKVOm1LRp07Rr1y7KPAAAAJihB4CEaMeOHfr222/N2w0aNNC8efOUN29e60IBAAAgQWGGHgASoJYtW6px48bKkiWLli1bpnXr1lHmAQAAYIcZegCw2MOHD7Vy5Uq9+eab5pjNZlNAQIBcXFyUPn16C9MBAAAgoaLQA4CFNmzYoF69eunUqVNKkyaNmjVrZm7Lli2bdcEAAACQ4LHkHgAscP36dXXu3Fn16tXTqVOnJEmDBw9WeHi4xckAAACQWFDoASAeGYahL7/8Up6envrqq6/M8WrVqmndunVydHS0MB0AAAASE5bcA0A8+fvvv9WrVy/99ttv5li6dOk0bdo0de3aVQ4OfMYKAACA6OOvRwCIYxEREZo0aZKKFStmV+bbtWunwMBAde/enTIPAACAGGOGHgDimM1m065duxQaGipJypMnj+bPn68GDRpYnAwAAACJGVNCABDHbDab5syZo3Tp0mnIkCE6cuQIZR4AAACvjBl6AIhFhmFo9erVcnNzU8OGDc3xXLly6fTp00qXLp114QAAAJCkUOgBIJacP39effv21dq1a5UjRw4dPXpU7u7u5nbKPAAAAGITS+4B4BWFh4frk08+kZeXl9auXStJunTpkpYuXWpxMgAAACRlzNADwCvYv3+/fH19tWvXLnMsW7Zs+vTTT9WyZUsLkwEAACCpY4YeAF7C/fv3NXToUJUpU8auzPfq1UuBgYFq1aqVbDabhQkBAACQ1DFDDwAxtGvXLrVp00Znzpwxx7y8vOTv76/KlStbFwwAAADJCjP0ABBD2bNn182bNyVJLi4umjhxovbt20eZBwAAQLxihh4AYihXrlyaPHmyVq5cqQULFqhQoUJWRwIAAEAyxAw9ADzHsWPH1KZNG925c8duvHfv3vrtt98o8wAAALAMM/QAEIXQ0FB99NFHmjRpksLCwpQxY0bNnz/f3O7gwOehAAAAsBaFHgD+448//pCvr6+CgoLMsQ0bNujevXtKnTq1hckAAACA/8MUEwD8f7dv35avr6+qVatmlnlHR0cNGzZMBw8epMwDAAAgQWGGHkCyZxiGVqxYoXfffVdXr141x8uVKyd/f3/5+PhYmA4AAACIGoUeQLLXqVMnLV261LydOnVqTZ48Wb1795ajo6OFyQAAAIBnY8k9gGSvSpUq5r+bNWumwMBA9evXjzIPAACABI0ZegDJjmEYstls5u2ePXvqt99+U4cOHdS8eXMLkwEAAADRR6EHkGzcu3dPY8eO1cOHDzVv3jxz3MHBQd98842FyQAAAICYo9ADSBbWrVunPn366Ny5c5Kk9u3bq2rVqhanAgAAAF4ex9ADSNIuX76sNm3aqHHjxmaZd3V11YkTJyxOBgAAALwaCj2AJCkiIkILFiyQp6en3XL6OnXq6PDhw+ratauF6QAAAIBXx5J7AEnOkSNH1LNnT23bts0cy5Qpk2bMmKFOnTrZnRAPAAAASKwo9ACSlN27d6tSpUp6/PixOdalSxdNmzZNmTJlsjAZAAAAELtYcg8gSSlVqpTKlSsnSSpYsKB+/fVXLVq0iDIPAACAJIcZegCJ2oMHD5QyZUrztoODg/z9/bV06VKNGjVKbm5uFqYDAAAA4g4z9AASJcMwtGTJEuXLl0+bN2+22+bl5aWJEydS5gEAAJCkUegBJDqnTp3S66+/rk6dOunatWvq2bOnQkNDrY4FAAAAxCsKPYBE4/Hjx/r444/l7e2tX375xRz39vbW/fv3LUwGAAAAxD+OoQeQKOzcuVM9evTQwYMHzbFcuXJp7ty5atq0qYXJAAAAAGswQw8gQbt7967eeecdVahQwSzzNptN7777ro4ePUqZBwAAQLLFDD2ABK1Hjx5avny5edvHx0cBAQEqW7ashakAAAAA6zFDDyBBGzdunJydneXm5qaPP/5Yu3btoswDAAAAYoYeQAISHh6uS5cuycPDwxwrUqSIFi1apAoVKihfvnwWpgMAAAASFmboASQIhw4dUpUqVVS7dm09evTIblv79u0p8wAAAMB/UOgBWOrhw4caOXKkSpUqpT///FN///23PvzwQ6tjAQAAAAkeS+4BWGbjxo3q2bOnTp48aY4VLlxYtWvXtjAVAAAAkDgwQw8g3l2/fl2dO3dWnTp1zDLv5OSksWPH6sCBA6pevbrFCQEAAICEjxl6APHGMAwtXrxYgwcP1s2bN83xqlWrasGCBfL09LQwHQAAAJC4UOgBxJtz587J19dXYWFhkqR06dLp448/Vvfu3eXgwIIhAAAAICb4CxpAvMmTJ4/ef/99SVLbtm0VGBioHj16UOYBAACAl8AMPYA4s3PnThUrVkxubm7m2LBhw1SxYkXVqVPHwmQAAABA4se0GIBYFxwcrD59+qhChQqaOHGi3TZnZ2fKPAAAABALKPQAYo1hGFq1apU8PT01f/58GYahjz/+WEFBQVZHAwAAAJIcCj2AWHH+/Hk1a9ZMrVq10uXLlyVJKVOm1Mcff6yCBQtanA4AAABIejiGHsArCQ8P19y5czVq1Cjdu3fPHG/UqJHmzp2rPHnyWJgOAAAASLoo9ABe2oEDB9SjRw/t2rXLHMuaNatmz56t1q1by2azWZgOAAAASNpYcg/gpf3www92Zb5nz54KCgpSmzZtKPMAAABAHLMZhmFYHSI+hYSEyN3dXcHBwUqbNq3VcYBELSwsTKVKlVJERIT8/f1VpUoVqyMBAAAACU5c9VCW3AOIlmvXrmnTpk1q06aNOebs7KwffvhB2bNnl4uLi4XpAAAAgOSHJfcAnsswDH3++ecqUqSIOnTooIMHD9ptz5s3L2UeAAAAsACFHsAzHTt2TLVq1VL37t11+/ZthYeHa/jw4VbHAgAAACAKPYAohIWF6YMPPlDx4sW1adMmc7xjx45atGiRZbkAAAAA/B+OoQdgZ+vWrfL19VVgYKA5li9fPvn5+alevXoWJgMAAADwb8zQA5Ak3b9/X7169VLVqlXNMu/o6Khhw4bp8OHDlHkAAAAggWGGHoCkf85Yv23bNvN2uXLl5O/vLx8fHwtTAQAAAHgWZugBSJKcnJwUEBAgd3d3zZ49W9u3b6fMAwAAAAkYM/RAMvTkyRPNnj1btWvXtivtFSpU0Llz55Q2bVoL0wEAAACIDgo9kMzs3btXPXr00N69e1W2bFnt2LFDjo6O5nbKPAAAAJA4sOQeSCbu3bunwYMHq2zZstq7d68kaffu3dqyZYvFyQAAAAC8jARR6OfOnau8efPK1dVV5cuX186dO5+5b0BAgKpWrar06dMrffr0qlOnznP3ByD9+OOP8vb21owZMxQRESFJ8vb21rZt21SzZk2L0wEAAAB4GZYX+uXLl2vQoEEaO3as9u7dKx8fH9WvX1/Xrl2Lcv9Nmzapffv2+v3337Vjxw55eHioXr16unjxYjwnBxK+K1euqG3btmrUqJHOnj0rSXJ1ddWHH36ovXv3qmLFihYnBAAAAPCybIZhGFYGKF++vMqWLas5c+ZIkiIiIuTh4aH+/ftr+PDhL7x/eHi40qdPrzlz5qhz584v3D8kJETu7u4KDg7mWGEkad9++626deumO3fumGO1a9eWn5+fChYsaF0wAAAAIJmJqx5q6Qx9WFiY9uzZozp16phjDg4OqlOnjnbs2BGtx3jw4IEeP36sDBkyRLk9NDRUISEhdl9AcpAzZ04FBwdLkjJmzKjFixdrw4YNlHkAAAAgibD0LPc3btxQeHi4smbNajeeNWtWBQUFResxhg0bphw5cth9KPBvkydP1vjx4185K5DYlCtXTv369VNwcLCmT5+uTJkyWR0JAAAAQCyy/Bj6VzFlyhQtW7ZM3377rVxdXaPcZ8SIEQoODja/zp8/H88pgbi3efNmtW/fXk+ePLEbnzVrlr788kvKPAAAAJAEWTpDnylTJjk6Ourq1at241evXlW2bNmee99p06ZpypQp+vXXX1W8ePFn7ufi4iIXF5dYyQskNLdu3dJ7772nzz//XNI/56QYMGCAud3BIVF/ZgcAAADgOSz9a9/Z2VmlS5fWxo0bzbGIiAht3LjxuWff/vjjj/XBBx9o/fr1KlOmTHxEBRIUwzC0dOlSeXp6mmVe+ufydBaf5xIAAABAPLF8+m7QoEEKCAjQl19+qcDAQPXu3Vv3799X165dJUmdO3fWiBEjzP0/+ugjjR49Wp9//rny5s2rK1eu6MqVK7p3755V3wIQr06dOqUGDRqoY8eO5uUd06ZNq3nz5mn9+vWy2WwWJwQAAAAQHyxdci9Jbdu21fXr1zVmzBhduXJFJUqU0Pr1680T5Z07d85u2fD8+fMVFhamVq1a2T3O2LFjNW7cuPiMDsSrx48fa+bMmRo3bpwePnxojrdo0UKzZ89Wzpw5LUwHAAAAIL5Zfh36+MZ16JEYhYWFqWLFitq7d685litXLs2dO1dNmza1MBkAAACAF0mS16EHED3Ozs6qWrWqJMlms+mdd97R0aNHKfMAAABAMmb5knsAUTMMw+54+A8++EAnT57U6NGjVa5cOQuTAQAAAEgImKEHEpiLFy+qZcuWmjFjht14mjRptHbtWso8AAAAAEkUeiDBiIiI0Lx58+Tl5aXVq1drzJgxOnPmjNWxAAAAACRQFHogATh8+LCqVKmivn37KiQkRJKUKlUqnT592uJkAAAAABIqCj1goYcPH2rUqFEqWbKkduzYYY5369ZNQUFBqlmzpoXpAAAAACRknBQPsMjGjRvVq1cvnThxwhwrVKiQFixYoBo1algXDAAAAECiQKEHLPD111+rQ4cO5m0nJyeNGDFCI0aMkKurq4XJAAAAACQWFHrAAk2aNFHu3Ll17tw5Va5cWf7+/vLy8rI6FgAAAIBEhEIPxIP79+8rVapU5u3UqVPL399fZ8+e1dtvvy0HB05nAQAAACBmaBFAHHr8+LEmT56s3LlzRzpjff369eXr60uZBwAAAPBSaBJAHNmxY4dKlSqlkSNH6tatW+rdu7cMw7A6FgAAAIAkgkIPxLLg4GD17dtXlStX1uHDhyVJDg4O8vLy0pMnTyxOBwAAACCp4Bh6IJYYhqFvv/1W/fv316VLl8zxkiVLKiAgQKVLl7YwHQAAAICkhhl6IBZcuHBBzZs3V8uWLc0ynzJlSk2fPl07d+6kzAMAAACIdczQA6/IMAw1atRIBw8eNMcaNmyouXPnKm/evNYFAwAAAJCkMUMPvCKbzaYpU6ZIkrJmzarly5frhx9+oMwDAAAAiFPM0AMx9ODBA4WEhChbtmzmWIMGDRQQEKCWLVsqffr0FqYDAAAAkFwwQw/EwC+//CJvb2917tw50iXo3n77bco8AAAAgHhDoQei4dq1a+rUqZPq16+v06dPa8OGDVq6dKnVsQAAAAAkYxR64DkMw9AXX3whT09PLVmyxByvXr06Z64HAAAAYCmOoQee4fjx4+rZs6c2bdpkjqVPn17Tpk1T165dZbPZrAsHAAAAINljhh74j7CwMH3wwQcqXry4XZnv0KGDgoKC1K1bN8o8AAAAAMsxQw/8x7Zt2zRmzBjzdr58+TR//nzVr1/fwlQAAAAAYI8ZeuA/atasqY4dO8rR0VFDhw7V4cOHKfMAAAAAEhyb8d9rbyVxISEhcnd3V3BwsNKmTWt1HFjMMAz99ttvqlWrlt0y+mvXrunSpUsqUaKEdeEAAAAAJAlx1UOZoUeydfbsWTVp0kR16tTRV199ZbctS5YslHkAAAAACRqFHslOeHi4Zs2apaJFi2rdunWSpEGDBunOnTvWBgMAAACAGOCkeEhW9u3bpx49emjPnj3mWPbs2TVnzhy5u7tbmAwAAAAAYoYZeiQL9+/f15AhQ1SmTBmzzNtsNvXp00eBgYFq0aIFl6IDAAAAkKgwQ48k76efflLv3r119uxZc8zb21v+/v6qWLGihckAAAAA4OUxQ48k7+uvvzbLvIuLiz788EPt2bOHMg8AAAAgUeOydUjyrl+/Lk9PT/n4+MjPz0+vvfaa1ZEAAAAAJCNx1UNZco8kJTAwUGfOnFGDBg3MscyZM2vnzp3Kly8fx8kDAAAASDJYco8kITQ0VOPGjZOPj486deqk69ev223Pnz8/ZR4AAABAkkKhR6K3efNm+fj4aPz48Xr8+LFu3bqlKVOmWB0LAAAAAOIUhR6J1q1bt/T222+rRo0aOnbsmCQpRYoUGjFihCZOnGhxOgAAAACIWxxDj0THMAwtX75c7777rq5du2aOV6hQQf7+/ipWrJiF6QAAAAAgfjBDj0Tl4sWLatiwodq3b2+W+TRp0mju3LnaunUrZR4AAABAssEMPRIVFxcX7d6927zdokULzZ49Wzlz5rQwFQAAAADEP2bokahkypRJM2fOVM6cOfXtt99q1apVlHkAAAAAyRKFHgnW3bt3NWzYMF29etVuvGPHjgoKClKzZs2sCQYAAAAACQBL7pEgrV27Vn379tX58+d14cIFLVmyxNxms9mUOnVqC9MBAAAAgPWYoUeCcvnyZbVu3VpNmzbV+fPn/197dx4VxdG+D/+aYR1WF0BBERcEjYILqI8QJa5gjMElSpAYFxR3jUYNUSOov4i7iQYjaiLG+ASicXvQqLhFBXfBFTAKBBNxjyAIsky9f/jaX0cGZBAYwetzzpxjV1dX3z1TzuGeqq4GAGzfvh1paWlajoyIiIiIiOjNwoSe3ghKpRJr1qxBs2bNsHXrVqm8Z8+euHz5Mho0aKDF6IiIiIiIiN48nHJPWnflyhUEBAQgNjZWKrO0tMSKFSswePBgyGQyLUZHRERERET0ZuIIPWnVsmXL0KZNG5Vkfvjw4UhISICfnx+TeSIiIiIiomJwhJ60ytraGvn5+QCApk2bIiwsDF26dNFyVERERERERG8+JvSkVb6+voiIiEDr1q0xc+ZMGBoaajskIiIiIiKiKoEJPVUKIQR+/vlnnDx5EqGhoVK5TCbDzp07ObWeiIiIiIhIQ0zoqcJdv34dY8aMwcGDBwEAvXv3xvvvvy/tZzJPRERERESkOS6KRxUmPz8fISEhcHJykpJ5AIiOjtZiVERERERERNUDR+ipQpw8eRIBAQG4dOmSVGZra4vVq1fjgw8+0GJkRERERERE1QNH6KlcZWZmYsKECXBzc5OSeblcjilTpuDq1atM5omIiIiIiMoJR+ip3Ny6dQvt27fHP//8I5W1adMG69atg4uLixYjIyIiIiIiqn44Qk/lxtraGk5OTgAAIyMjLF26FKdPn2YyT0REREREVAGY0FOZKZVKlW2ZTIbVq1ejf//+uHLlCj7//HPo6nISCBERERERUUVgQk9lcvHiRbi5uSEqKkqlvFGjRvjtt9/QsGFD7QRGRERERET0lmBCTxp58uQJAgMD4eLiglOnTmHcuHHIysrSdlhERERERERvHSb0VGrR0dFwcnLCokWLUFBQAAAwNjZWWQSPiIiIiIiIKgcTenqle/fuYciQIejZsyeSk5MBAPr6+ggODkZ8fDwcHR21HCEREREREdHbhyuWUbGEEAgPD8e0adPw8OFDqbxz584ICwtDs2bNtBgdERERERHR240j9FSsOXPmYMSIEVIyX6NGDaxfvx6HDx9mMk9ERERERKRlTOipWCNHjoSRkREAwNfXF4mJifD394dczm5DRERERESkbZxyT5LHjx/D1NRU2razs0NoaCjq1KmDXr16aTEyIiIiIiIiehmHWgmPHj3C2LFj0bJlSzx+/Fhl37Bhw5jMExERERERvYGY0L/FhBDYunUrmjdvjjVr1iAtLQ2zZ8/WdlhERERERERUCpxy/5ZKS0vD+PHjERUVJZUZGxvD3t5ei1ERERERERFRaXGE/i1TWFiIb775Bu+8845KMv/BBx/g6tWrmDhxohajIyIiIiIiotLiCP1bJC4uDgEBATh79qxUZm1tjZUrV2LAgAGQyWRajI6IiIiIiIg0wYT+LZGVlYWuXbvi0aNHUtnYsWMREhICc3Nz7QVGREREREREZcIp928JExMTBAcHAwBatGiBmJgYrF69msk8ERERERFRFcUR+mrqzp07UCgUMDMzk8omTJgAhUKBYcOGQV9fX4vRERERERER0eviCH01o1QqsX79ejRr1gyzZs1S2aejo4OAgAAm80RERERERNUAE/pqJDExEV26dMGoUaPw6NEjhIaG4uTJk9oOi4iIiIiIiCoAE/pq4OnTpwgODkarVq1w9OhRqfyTTz5BkyZNtBgZERERERERVRTeQ1/FHT16FKNHj0ZiYqJU1rhxY4SFhaF79+5ajIyIiIiIiIgqEkfoq6h///0Xo0aNgoeHh5TM6+rqIjAwEJcuXWIyT0REREREVM1xhL6KioyMxPr166XtDh06YO3atXB2dtZiVERERFSVFBYWIj8/X9thEBFVC3p6etDR0anUc8qEEKJSz6hlmZmZMDc3R0ZGhsoj3aqawsJCuLm5ISEhASEhIRgzZkyldx4iIiKqurKysvD333/jLftTkIiowshkMtSvXx8mJiZF9lVUHsoR+iqgoKAAR44cUZlGr6Ojg02bNsHY2Bj16tXTYnRERERU1RQWFuLvv/+GkZERLC0tIZPJtB0SEVGVJoTAvXv38Pfff6Np06aVNtjKhP4Nd+7cOYwaNQrx8fE4fvw43NzcpH0ODg5ajIyIiIiqqvz8fAghYGlpCYVCoe1wiIiqBUtLS6SmpiI/P7/SEnouiveGysrKwpQpU9C+fXvExcVBCIGxY8dCqVRqOzQiIiKqJjgyT0RUfrTxncoR+jdQVFQUxo8fj7S0NKnMyckJa9euhVzO32CIiIiIiIiII/RvlPT0dAwaNAh9+vSRknlDQ0MsXLgQ586dQ4cOHbQcIREREREREb0pmNC/AZRKJcLCwtC8eXNs2bJFKu/RowcuX76ML774Anp6elqMkIiIiIiqsx07dsDe3h46Ojr47LPPND4+PDwcNWrUKPe46PXl5eXB3t4esbGx2g6lStu7dy9at279xt0CzYT+DSCEQHh4ODIyMgAAFhYW2LRpE/bt24cmTZpoOToiIiKiN8OwYcMgk8kgk8mgp6eHRo0aYcaMGcjNzS1SNyoqCh4eHjA1NYWRkRHatWuH8PBwte3+9ttveO+992Bubg4TExM4Oztj3rx5ePjwYQVf0Ztj9OjR+Oijj3Dz5k3Mnz9f2+FoJDU1FTKZDPHx8Wr3v/hjw7Jly1CzZk21febJkycwMzPDypUrAQANGzaU+tuLr4ULF5Y6JnWvkydPSvXy8vKwePFitGrVCkZGRrCwsIC7uzs2bNiA/Px8qd7t27cxefJk2Nvbw9DQEHXq1IG7uzu+//57PHnypMRY1qxZg0aNGqksrk2a8/Lygp6eHjZv3qztUFQwoX8D6OjoYO3atdDT08OwYcOQmJiITz75hAvVEBEREb3Ey8sL6enpSE5OxooVKxAWFoagoCCVOqtWrYK3tzfc3d1x6tQpXLx4ER9//DHGjBmDadOmqdSdNWsWfHx80K5dO/z++++4fPkyli1bhgsXLmDTpk2Vdl15eXmVdq6XZWVl4e7du/D09ISNjQ1MTU21FktFGzJkCLKzs7Ft27Yi+7Zu3Yq8vDx88sknUtm8efOQnp6u8po4cWKpz3fgwIEix7u4uAB49pl7enpi4cKFCAgIQGxsLE6fPo3x48dj1apVuHLlCgAgOTkZbdq0wf79+7FgwQLExcXhxIkTmDFjBqKionDgwIFizy+EwHfffQd/f/9Sx6yONvvnm2TYsGHSDz5vDPGWycjIEABERkaG1mI4dOiQOHnyZJHylJSUyg+GiIiI3jo5OTni6tWrIicnR9uhaGTo0KHC29tbpax///6iTZs20nZaWprQ09MTU6dOLXL8ypUrBQDp77BTp04JAOKbb75Re75///232Fhu3rwpPv74Y1GzZk1hZGQkXFxcpHbVxTl58mTh4eEhbXt4eIjx48eLyZMni9q1a4v33ntP+Pr6ikGDBqkcl5eXJ2rXri02btwohBCisLBQLFiwQDRs2FAYGhoKZ2dnsWXLlmLjFEKIhw8fiiFDhogaNWoIhUIhvLy8xLVr14QQQhw+fFgAUHkdPny42PcjICBAWFlZCQMDA9GiRQvxv//9TwghxIYNG4S5ublU9/r16+LDDz8UVlZWwtjYWLi6uoro6GiV9kJDQ4W9vb0wMDAQVlZWYsCAAdK+LVu2iJYtWwpDQ0NRq1Yt0a1bN5GVlaU2rpSUFAFAxMXFqd3/cmz9+/cX3bp1K1LPw8ND+Pj4SNt2dnZixYoVatt8lVfFJIQQixYtEnK5XJw/f77Ivry8POl6PT09Rf369Yu9fqVSWew5zpw5I+RyucjMzFQpnzFjhmjatKlQKBSiUaNGYvbs2SIvL0/aHxQUJFq1aiXWrVsnGjZsKGQymRDiWR/w9/cXFhYWwtTUVHTp0kXEx8dLx5Xmcy9vz2P96aefhJ2dnTAzMxM+Pj4q1/z7778Ld3d3YW5uLmrVqiV69+4trl+/Lu1//nn99ttv4r333hMKhUI4OzuL2NhYlXP99ddfAoDKsS8q6bu1ovJQjtBXogcPHmDEiBHo2rUrRowYUeSXroYNG2onMCIiInrruQKor4WX62vEfPnyZcTGxkJfX18q27p1K/Lz84uMxAPPppWbmJjgl19+AQBs3rwZJiYmGDdunNr2i7snPCsrCx4eHvjnn3+wa9cuXLhwATNmzND43tqNGzdCX18fMTExWLNmDfz8/PC///0PWVlZUp19+/bhyZMn6NevHwAgJCQEP/30E9asWYMrV65gypQp+OSTT/DHH38Ue55hw4bh7Nmz2LVrF06cOAEhBN5//33k5+fDzc0NSUlJAJ7depCenq52arZSqUSvXr0QExODn3/+GVevXsXChQuLfdZ2VlYW3n//fRw8eBBxcXHw8vJSWfj57NmzmDRpEubNm4ekpCTs3bsXnTt3BvBsoWhfX1+MGDECCQkJOHLkCPr37w8hhEbvb3H8/f1x6NAh/PXXX1JZcnIyjh49+toj2ZrYvHkzunfvjjZt2hTZp6enB2NjYzx48AD79+/H+PHjYWxsrLadkmb1Hjt2DA4ODkVmXZiamiI8PBxXr17Ft99+i3Xr1mHFihUqda5fv47ffvsN27Ztk25nGDhwIO7evYvff/8d586dQ9u2bdGtWzfp9pRXfe7FxWhiYlLi61XT3G/cuIEdO3YgKioKUVFR+OOPP1RujcjOzsbUqVNx9uxZHDx4EHK5HP369Svyf3bWrFmYNm0a4uPj4eDgAF9fXxQUFEj7GzRogDp16uDYsWMlxlOpyvXngSpAGyP0SqVSbNq0SVhYWKj8+rl+/fpKi4GIiIjoOXWjSPWEENDCq54GcQ8dOlTo6OgIY2NjYWBgIAAIuVwutm7dKtUZM2aMymjsy5ydnUWvXr2EEEL06tVLODs7axDBM2FhYcLU1FQ8ePCg2DhLM0L/4swCIYTIz88XFhYW4qeffpLKfH19pVHj3NxcYWRkVGTU0N/fX/j6+qqN5dq1awKAiImJkcru378vFAqF+PXXX4UQz0ZdUcLIvBBC7Nu3T8jlcpGUlKR2/8uj4Oq0aNFCrFq1SgghxG+//SbMzMyKjBwLIcS5c+cEAJGamlpie89pOkJfUFAg6tWrJ4KCgqSyr776SjRo0EAUFhZKZXZ2dkJfX18YGxurvI4ePVrqmBQKRZHjn1MoFGLSpEkltnPy5EkBQGzbtk2lvHbt2lJ7M2bMKPb4yZMni65du74y3iVLlggXFxdpOygoSOjp6Ym7d+9KZceOHRNmZmYiNzdX5dgmTZqIsLCwYtt+8XNX58mTJ+LPP/8s8aWun7wYq5GRkUqd6dOniw4dOhR7zL179wQAcenSJSHE/31eL+ZnV65cEQBEQkKCyrFt2rQRwcHBatvVxgg9n0NfwW7cuIGxY8ciOjpaKjM3N8eiRYswfPhwLUZGRERE9H/qVpHzdunSBd9//z2ys7OxYsUK6OrqYsCAAWU6tyjjiG98fDzatGmDWrVqlen4557fS/2crq4uBg0ahM2bN0v3eu/cuRMREREAno2YPnnyBD169FA5Li8vT+0oLwAkJCRAV1dX5fHHtWvXhqOjIxISEkoda3x8POrXrw8HB4dS1c/KykJwcDB2796N9PR0FBQUICcnRxqp7dGjB+zs7NC4cWN4eXnBy8sL/fr1g5GREVq1aoVu3brByckJnp6e6NmzJz766CPUrFmz1PGWREdHB0OHDkV4eDiCgoIghMDGjRsxfPhwyOWqE5inT5+OYcOGqZTVq1ev1OeKjIxE8+bN1e4ra/8DgNOnT0OpVMLPzw9Pnz4ttl5OTg4MDQ3VxrVy5UrcuHEDWVlZKCgogJmZmUodOzs7WFpaStsXLlxAVlYWateuXeQcN27cAPDqz10dhUIBe3v7Ul13cRo2bKgyC8Ha2hp3796Vtv/880/MmTMHp06dwv3796WR+bS0NLRs2VKq5+zsrNIGANy9exfNmjVTifdVCxFWJib0FSQ/Px/Lly9HcHCwyiqaAwcOxLfffit1ECIiIqI3wVltB1BKxsbG0h//P/74I1q1aoUffvhBmirt4OCAjIwM3Lp1CzY2NirH5uXl4caNG+jSpYtU9/jx48jPz9foEcEKhaLE/XK5vEiy9uKK5S9ey8v8/Pzg4eGBu3fvIjo6GgqFAl5eXgAgTcXfvXt3kaTSwMCg1PGXxauu+WXTpk1DdHQ0li5dCnt7eygUCnz00UfSLaempqY4f/48jhw5gv3792POnDkIDg7GmTNnUKNGDURHRyM2Nhb79+/HqlWrMGvWLJw6dQqNGjUql+sZMWIEQkJCcOjQISiVSty8eVPtYJuFhcVrJZu2trbFHu/g4IDExMQSj7e3t4dMJpNui3iucePGAF79uVhYWODSpUsqZSdOnICfnx/mzp0LT09PmJubIyIiAsuWLVOp93L/zMrKgrW1NY4cOVLkPM9vT3nV567OsWPH0KtXrxKvIywsDH5+fsXuf/n/r0wmU5lO36dPH9jZ2WHdunWwsbGBUqlEy5Yti8T1YjvPb2V4eVr+w4cPVX7o0DbeQ18BLly4AFdXVwQGBkrJvK2tLXbt2oVff/2VyTwRERFROZDL5Zg5cyZmz56NnJwcAMCAAQOgp6dXJDkBnj2+Kzs7G76+vgCAwYMHIysrC6tXr1bb/qNHj9SWOzs7Iz4+vtjH2llaWiI9PV2lrLhHqr3Mzc0Ntra2iIyMxObNmzFw4EApyXjnnXdgYGCAtLQ02Nvbq7xsbW3Vtte8eXMUFBTg1KlTUtmDBw+QlJSEd955p1QxAc+u+e+//8a1a9dKVT8mJgbDhg1Dv3794OTkhLp16yI1NVWljq6uLrp3747Fixfj4sWLSE1NxaFDhwA8S6bc3d0xd+5cxMXFQV9fH9u3by91vK/SpEkTeHh44Mcff8SGDRvQvXt32NnZlVv7pTF48GAcOHAAcXFxRfbl5+cjOzsbtWvXRo8ePfDdd98hOztb43O0adMGiYmJKj8wxcbGws7ODrNmzYKrqyuaNm2qsp5Acdq2bYvbt29DV1e3SP+zsLAAULrP/WWurq6Ij48v8fXhhx9qfO3PPe/vs2fPRrdu3dC8eXP8+++/ZWorNzcXN27cKHZGjDZwhL4C6OrqSlOY5HI5Jk2ahPnz58PExETLkRERERFVLwMHDsT06dMRGhqKadOmoUGDBli8eDE+//xzGBoaYsiQIdDT08POnTsxc+ZMfP7559L08w4dOmDGjBn4/PPP8c8//6Bfv36wsbHB9evXsWbNGrz77ruYPHlykXP6+vpiwYIF6Nu3L0JCQmBtbY24uDjY2NigY8eO6Nq1K5YsWYKffvoJHTt2xM8//4zLly+XOgkYPHgw1qxZg2vXruHw4cNSuampKaZNm4YpU6ZAqVTi3XffRUZGBmJiYmBmZoahQ4cWaatp06bw9vbGqFGjEBYWBlNTUwQGBqJevXrw9vYu9fvs4eGBzp07Y8CAAVi+fDns7e2RmJgImUwmzSB4+bzbtm1Dnz59IJPJ8NVXX6mMdEZFRSE5ORmdO3dGzZo1sWfPHiiVSjg6OuLUqVM4ePAgevbsCSsrK5w6dQr37t0rdur6cy+PYgNAixYtiq3v7++PUaNGAXj2rHp1Hj9+jNu3b6uUGRkZFZmeXpwHDx4UOb5GjRowNDTEZ599ht27d6Nbt26YP38+3n33XZiamuLs2bNYtGgRfvjhB7Ru3RqrV6+Gu7s7XF1dERwcDGdnZ8jlcpw5cwaJiYlFbt14UZcuXZCVlYUrV65IU8ubNm2KtLQ0REREoF27dti9e3epfizp3r07OnbsiL59+2Lx4sVwcHDArVu3sHv3bvTr10/6caCkz12d8phyX5KaNWuidu3aWLt2LaytrZGWlobAwMAytXXy5EkYGBigY8eO5RzlayjXO/KrgMpaFG/WrFmidevW4syZMxV6HiIiIiJNVafH1gkhREhIiLC0tFR5rNfOnTtFp06dhLGxsTA0NBQuLi7ixx9/VNtuZGSk6Ny5szA1NRXGxsbC2dlZzJs3r8TH1qWmpooBAwYIMzMzYWRkJFxdXcWpU6ek/XPmzBF16tQR5ubmYsqUKWLChAlFFsWbPHmy2ravXr0qAAg7O7sijyRTKpXim2++EY6OjkJPT09YWloKT09P8ccffxQb6/PH1pmbmwuFQiE8PT2lx9YJUbpF8YQQ4sGDB2L48OGidu3awtDQULRs2VJERUUJIYouPJeSkiK6dOkiFAqFsLW1Fd99953KNR87dkx4eHiImjVrSo8Ii4yMlK7f09NTWFpaCgMDA+Hg4FDiomrPFzRT97p582axC/Y9efJEeozZywu9CfFsUTx1bY4ePbrE9+lVMf3yyy9SvdzcXBESEiKcnJykR/S5u7uL8PBwkZ+fL9W7deuWmDBhgmjUqJHQ09MTJiYmon379mLJkiUiOzu7xFgGDRokAgMDVcqmT58uateuLUxMTISPj49YsWKFynv0/FFwL8vMzBQTJ04UNjY2Qk9PT9ja2go/Pz+RlpYmXXdJn3tFUBfrihUrhJ2dnbQdHR0tmjdvLgwMDISzs7M4cuSIACC2b98uxY2XFlZU9/8iICCgxM9fG4viyYQop+c/VBGZmZkwNzdHRkZGqX9ZK8k///yDxYsXY/HixSr3Lj19+hQ6OjrQ1eUkCCIiInqz5ObmIiUlBY0aNVK7YBYRVR8XL15Ejx49cOPGDc4Yfg3379+Ho6Mjzp49W+xaDiV9t5Z3Hvoc76Evo8LCQoSGhqJ58+ZYuXIlFi1apLLfwMCAyTwREREREWmVs7MzFi1ahJSUFG2HUqWlpqZi9erV5bYwY3lhQl8GFy9ehLu7OyZMmIDHjx8DANavX6+ymj0REREREVVPY8aMgYmJidrXmDFjtB1eEcOGDYOTk5O2w6jSXF1d4ePjo+0wiuAQsgZycnIwb948LF26FAUFBVL5yJEjsWjRIk5ZIyIiIiJ6C8ybNw/Tpk1Tu688p1MTvQoT+lKKjo7GmDFjkJycLJU5Ojpi7dq16Ny5sxYjIyIiIiKiymRlZQUrKytth0HEKfevIoTAyJEj0bNnTymZ19fXR1BQEC5cuMBknoiIiKqst2xtZCKiCqWN71SO0L+CTCaDjY2NtN2pUyeEhYW98jmYRERERG8qHR0dAEBeXh4UCoWWoyEiqh7y8vIA/N93bGVgQl8KM2fORHR0NPz9/TFixAjI5ZzYQERERFWXrq4ujIyMcO/ePejp6fFvGyKi16RUKnHv3j0YGRlV6tPOmNC/IC8vD0uWLIFMJsPMmTOlckNDQ8TGxkImk2kxOiIiIqLyIZPJYG1tjZSUFPz111/aDoeIqFqQy+Vo0KBBpeaNTOj/f7GxsQgICMCVK1egp6eHvn374p133pH2M5knIiKi6kRfXx9NmzaVpogSEdHr0dfXr/QZT299Qv/o0SN8+eWXWLNmjVRWWFiIY8eOqST0RERERNWNXC7nY3eJiKqwN+KGqdDQUDRs2BCGhobo0KEDTp8+XWL9LVu2oFmzZjA0NISTkxP27Nmj8TmFENi6dSveeecdlWTexcUFZ86cwejRozVuk4iIiIiIiKiyaD2hj4yMxNSpUxEUFITz58+jVatW8PT0xN27d9XWj42Nha+vL/z9/REXF4e+ffuib9++uHz5skbn/fjjjzFw4ECkp6cDAIyNjbFixQqcPHkSbdu2fe3rIiIiIiIiIqpIMqHlB5B26NAB7dq1w3fffQfg2eqAtra2mDhxIgIDA4vU9/HxQXZ2NqKioqSy//znP2jdurXKSHtxMjMzYW5urlL2wQcfIDQ0FA0aNHjNqyEiIiIiIiJS9TwPzcjIgJmZWbm1q9V76PPy8nDu3Dl8+eWXUplcLkf37t1x4sQJtcecOHECU6dOVSnz9PTEjh071NZ/+vQpnj59Km1nZGRI/7ayssKSJUvg7e0NmUyGzMzM17gaIiIiIiIioqKe55rlPZ6u1YT+/v37KCwsRJ06dVTK69Spg8TERLXH3L59W23927dvq60fEhKCuXPnqt139+5dDB06tAyRExEREREREWnmwYMHRWaMv45qv8r9l19+qTKi/+jRI9jZ2SEtLa1c30iiN0lmZiZsbW1x8+bNcp3SQ/QmYT+ntwH7Ob0N2M/pbZCRkYEGDRqgVq1a5dquVhN6CwsL6Ojo4M6dOyrld+7cQd26ddUeU7duXY3qGxgYwMDAoEi5ubk5vzCo2jMzM2M/p2qP/ZzeBuzn9DZgP6e3QXk/p16rq9zr6+vDxcUFBw8elMqUSiUOHjyIjh07qj2mY8eOKvUBIDo6utj6RERERERERNWR1qfcT506FUOHDoWrqyvat2+Pb775BtnZ2Rg+fDgA4NNPP0W9evUQEhICAJg8eTI8PDywbNky9O7dGxERETh79izWrl2rzcsgIiIiIiIiqlRaT+h9fHxw7949zJkzB7dv30br1q2xd+9eaeG7tLQ0lWkJbm5u+O9//4vZs2dj5syZaNq0KXbs2IGWLVuW6nwGBgYICgpSOw2fqLpgP6e3Afs5vQ3Yz+ltwH5Ob4OK6udafw49EREREREREWlOq/fQExEREREREVHZMKEnIiIiIiIiqoKY0BMRERERERFVQUzoiYiIiIiIiKqgapnQh4aGomHDhjA0NESHDh1w+vTpEutv2bIFzZo1g6GhIZycnLBnz55KipSo7DTp5+vWrUOnTp1Qs2ZN1KxZE927d3/l/wuiN4Gm3+fPRUREQCaToW/fvhUbIFE50LSfP3r0COPHj4e1tTUMDAzg4ODAv13ojadpP//mm2/g6OgIhUIBW1tbTJkyBbm5uZUULZHmjh49ij59+sDGxgYymQw7dux45TFHjhxB27ZtYWBgAHt7e4SHh2t83mqX0EdGRmLq1KkICgrC+fPn0apVK3h6euLu3btq68fGxsLX1xf+/v6Ii4tD37590bdvX1y+fLmSIycqPU37+ZEjR+Dr64vDhw/jxIkTsLW1Rc+ePfHPP/9UcuREpadpP38uNTUV06ZNQ6dOnSopUqKy07Sf5+XloUePHkhNTcXWrVuRlJSEdevWoV69epUcOVHpadrP//vf/yIwMBBBQUFISEjADz/8gMjISMycObOSIycqvezsbLRq1QqhoaGlqp+SkoLevXujS5cuiI+Px2effYaRI0di3759mp1YVDPt27cX48ePl7YLCwuFjY2NCAkJUVt/0KBBonfv3iplHTp0EKNHj67QOIleh6b9/GUFBQXC1NRUbNy4saJCJHptZennBQUFws3NTaxfv14MHTpUeHt7V0KkRGWnaT///vvvRePGjUVeXl5lhUj02jTt5+PHjxddu3ZVKZs6dapwd3ev0DiJygsAsX379hLrzJgxQ7Ro0UKlzMfHR3h6emp0rmo1Qp+Xl4dz586he/fuUplcLkf37t1x4sQJtcecOHFCpT4AeHp6FlufSNvK0s9f9uTJE+Tn56NWrVoVFSbRaylrP583bx6srKzg7+9fGWESvZay9PNdu3ahY8eOGD9+POrUqYOWLVtiwYIFKCwsrKywiTRSln7u5uaGc+fOSdPyk5OTsWfPHrz//vuVEjNRZSivPFS3PIPStvv376OwsBB16tRRKa9Tpw4SExPVHnP79m219W/fvl1hcRK9jrL085d98cUXsLGxKfIlQvSmKEs/P378OH744QfEx8dXQoREr68s/Tw5ORmHDh2Cn58f9uzZg+vXr2PcuHHIz89HUFBQZYRNpJGy9PPBgwfj/v37ePfddyGEQEFBAcaMGcMp91StFJeHZmZmIicnBwqFolTtVKsReiJ6tYULFyIiIgLbt2+HoaGhtsMhKhePHz/GkCFDsG7dOlhYWGg7HKIKo1QqYWVlhbVr18LFxQU+Pj6YNWsW1qxZo+3QiMrNkSNHsGDBAqxevRrnz5/Htm3bsHv3bsyfP1/boRG9carVCL2FhQV0dHRw584dlfI7d+6gbt26ao+pW7euRvWJtK0s/fy5pUuXYuHChThw4ACcnZ0rMkyi16JpP79x4wZSU1PRp08fqUypVAIAdHV1kZSUhCZNmlRs0EQaKsv3ubW1NfT09KCjoyOVNW/eHLdv30ZeXh709fUrNGYiTZWln3/11VcYMmQIRo4cCQBwcnJCdnY2AgICMGvWLMjlHJOkqq+4PNTMzKzUo/NANRuh19fXh4uLCw4ePCiVKZVKHDx4EB07dlR7TMeOHVXqA0B0dHSx9Ym0rSz9HAAWL16M+fPnY+/evXB1da2MUInKTNN+3qxZM1y6dAnx8fHS68MPP5RWjrW1ta3M8IlKpSzf5+7u7rh+/br0gxUAXLt2DdbW1kzm6Y1Uln7+5MmTIkn78x+xnq03RlT1lVseqtl6fW++iIgIYWBgIMLDw8XVq1dFQECAqFGjhrh9+7YQQoghQ4aIwMBAqX5MTIzQ1dUVS5cuFQkJCSIoKEjo6emJS5cuaesSiF5J036+cOFCoa+vL7Zu3SrS09Ol1+PHj7V1CUSvpGk/fxlXuaeqQNN+npaWJkxNTcWECRNEUlKSiIqKElZWVuL//b//p61LIHolTft5UFCQMDU1Fb/88otITk4W+/fvF02aNBGDBg3S1iUQvdLjx49FXFyciIuLEwDE8uXLRVxcnPjrr7+EEEIEBgaKIUOGSPWTk5OFkZGRmD59ukhISBChoaFCR0dH7N27V6PzVruEXgghVq1aJRo0aCD09fVF+/btxcmTJ6V9Hh4eYujQoSr1f/31V+Hg4CD09fVFixYtxO7duys5YiLNadLP7ezsBIAir6CgoMoPnEgDmn6fv4gJPVUVmvbz2NhY0aFDB2FgYCAaN24svv76a1FQUFDJURNpRpN+np+fL4KDg0WTJk2EoaGhsLW1FePGjRP//vtv5QdOVEqHDx9W+/f28749dOhQ4eHhUeSY1q1bC319fdG4cWOxYcMGjc8rE4LzVoiIiIiIiIiqmmp1Dz0RERERERHR24IJPREREREREVEVxISeiIiIiIiIqApiQk9ERERERERUBTGhJyIiIiIiIqqCmNATERERERERVUFM6ImIiIiIiIiqICb0RERERERERFUQE3oiIqJKFB4ejho1amg7jDKTyWTYsWNHiXWGDRuGvn37Vko8REREbzMm9ERERBoaNmwYZDJZkdf169e1HRrCw8OleORyOerXr4/hw4fj7t275dJ+eno6evXqBQBITU2FTCZDfHy8Sp1vv/0W4eHh5XK+4gQHB0vXqaOjA1tbWwQEBODhw4catcMfH4iIqCrT1XYAREREVZGXlxc2bNigUmZpaamlaFSZmZkhKSkJSqUSFy5cwPDhw3Hr1i3s27fvtduuW7fuK+uYm5u/9nlKo0WLFjhw4AAKCwuRkJCAESNGICMjA5GRkZVyfiIiIm3jCD0REVEZGBgYoG7duiovHR0dLF++HE5OTjA2NoatrS3GjRuHrKysYtu5cOECunTpAlNTU5iZmcHFxQVnz56V9h8/fhydOnWCQqGAra0tJk2ahOzs7BJjk8lkqFu3LmxsbNCrVy9MmjQJBw4cQE5ODpRKJebNm4f69evDwMAArVu3xt69e6Vj8/LyMGHCBFhbW8PQ0BB2dnYICQlRafv5lPtGjRoBANq0aQOZTIb33nsPgOqo99q1a2FjYwOlUqkSo7e3N0aMGCFt79y5E23btoWhoSEaN26MuXPnoqCgoMTr1NXVRd26dVGvXj10794dAwcORHR0tLS/sLAQ/v7+aNSoERQKBRwdHfHtt99K+4ODg7Fx40bs3LlTGu0/cuQIAODmzZsYNGgQatSogVq1asHb2xupqaklxkNERFTZmNATERGVI7lcjpUrV+LKlSvYuHEjDh06hBkzZhRb38/PD/Xr18eZM2dw7tw5BAYGQk9PDwBw48YNeHl5YcCAAbh48SIiIyNx/PhxTJgwQaOYFAoFlEolCgoK8O2332LZsmVYunQpLl68CE9PT3z44Yf4888/AQArV67Erl278OuvvyIpKQmbN29Gw4YN1bZ7+vRpAMCBAweQnp6Obdu2FakzcOBAPHjwAIcPH5bKHj58iL1798LPzw8AcOzYMXz66aeYPHkyrl69irCwMISHh+Prr78u9TWmpqZi37590NfXl8qUSiXq16+PLVu24OrVq5gzZw5mzpyJX3/9FQAwbdo0DBo0CF5eXkhPT0d6ejrc3NyQn58PT09PmJqa4tixY4iJiYGJiQm8vLyQl5dX6piIiIgqnCAiIiKNDB06VOjo6AhjY2Pp9dFHH6mtu2XLFlG7dm1pe8OGDcLc3FzaNjU1FeHh4WqP9ff3FwEBASplx44dE3K5XOTk5Kg95uX2r127JhwcHISrq6sQQggbGxvx9ddfqxzTrl07MW7cOCGEEBMnThRdu3YVSqVSbfsAxPbt24UQQqSkpAgAIi4uTqXO0KFDhbe3t7Tt7e0tRowYIW2HhYUJGxsbUVhYKIQQolu3bmLBggUqbWzatElYW1urjUEIIYKCgoRcLhfGxsbC0NBQABAAxPLly4s9Rgghxo8fLwYMGFBsrM/P7ejoqPIePH36VCgUCrFv374S2yciIqpMvIeeiIioDLp06YLvv/9e2jY2NgbwbLQ6JCQEiYmJyMzMREFBAXJzc/HkyRMYGRkVaWfq1KkYOXIkNm3aJE0bb9KkCYBn0/EvXryIzZs3S/WFEFAqlUhJSUHz5s3VxpaRkQETExMolUrk5ubi3Xffxfr165GZmYlbt27B3d1dpb67uzsuXLgA4Nl0+R49esDR0RFeXl744IMP0LNnz9d6r/z8/DBq1CisXr0aBgYG2Lx5Mz7++GPI5XLpOmNiYlRG5AsLC0t83wDA0dERu3btQm5uLn7++WfEx8dj4sSJKnVCQ0Px448/Ii0tDTk5OcjLy0Pr1q1LjPfChQu4fv06TE1NVcpzc3Nx48aNMrwDREREFYMJPRERURkYGxvD3t5epSw1NRUffPABxo4di6+//hq1atXC8ePH4e/vj7y8PLWJaXBwMAYPHozdu3fj999/R1BQECIiItCvXz9kZWVh9OjRmDRpUpHjGjRoUGxspqamOH/+PORyOaytraFQKAAAmZmZr7yutm3bIiUlBb///jsOHDiAQYMGoXv37ti6desrjy1Onz59IITA7t270a5dOxw7dgwrVqyQ9mdlZWHu3Lno379/kWMNDQ2LbVdfX1/6DBYuXIjevXtj7ty5mD9/PgAgIiIC06ZNw7Jly9CxY0eYmppiyZIlOHXqVInxZmVlwcXFReWHlOfelIUPiYiIACb0RERE5ebcuXNQKpVYtmyZNPr8/H7tkjg4OMDBwQFTpkyBr68vNmzYgH79+qFt27a4evVqkR8OXkUul6s9xszMDDY2NoiJiYGHh4dUHhMTg/bt26vU8/HxgY+PDz766CN4eXnh4cOHqFWrlkp7z+9XLywsLDEeQ0ND9O/fH5s3b8b169fh6OiItm3bSvvbtm2LpKQkja/zZbNnz0bXrl0xduxY6Trd3Nwwbtw4qc7LI+z6+vpF4m/bti0iIyNhZWUFMzOz14qJiIioInFRPCIionJib2+P/Px8rFq1CsnJydi0aRPWrFlTbP2cnBxMmDABR44cwV9//YWYmBicOXNGmkr/xRdfIDY2FhMmTEB8fDz+/PNP7Ny5U+NF8V40ffp0LFq0CJGRkUhKSkJgYCDi4+MxefJkAMDy5cvxyy+/IDExEdeuXcOWLVtQt25d1KhRo0hbVlZWUCgU2Lt3L+7cuYOMjIxiz+vn54fdu3fjxx9/lBbDe27OnDn46aefMHfuXFy5cgUJCQmIiIjA7NmzNbq2jh07wtnZGQsWLAAANG3aFGfPnsW+fftw7do1fPXVVzhz5ozKMQ0bNsTFixeRlJSE+/fvIz8/H35+frCwsIC3tzeOHTuGlJQUHDlyBJMmTcLff/+tUUxEREQViQk9ERFROWnVqhWWL1+ORYsWoWXLlti8ebPKI99epqOjgwcPHuDTTz+Fg4MDBg0ahF69emHu3LkAAGdnZ/zxxx+4du0aOnXqhDZt2mDOnDmwsbEpc4yTJk3C1KlT8fnnn8PJyQl79+7Frl270LRpUwDPpusvXrwYrq6uaNeuHVJTU7Fnzx5pxsGLdHV1sXLlSoSFhcHGxgbe3t7Fnrdr166oVasWkpKSMHjwYJV9np6eiIqKwv79+9GuXTv85z//wYoVK2BnZ6fx9U2ZMgXr16/HzZs3MXr0aPTv3x8+Pj7o0KEDHjx4oDJaDwCjRo2Co6MjXF1dYWlpiZiYGBgZGeHo0aNo0KAB+vfvj+bNm8Pf3x+5ubkcsSciojeKTAghtB0EEREREREREWmGI/REREREREREVRATeiIiIiIiIqIqiAk9ERERERERURXEhJ6IiIiIiIioCmJCT0RERERERFQFMaEnIiIiIiIiqoKY0BMRERERERFVQUzoiYiIiIiIiKogJvREREREREREVRATeiIiIiIiIqIqiAk9ERERERERURX0/wHpA0616L4wMwAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, precision_score, recall_score, f1_score\n",
        "\n",
        "# Predict the labels for the validation data\n",
        "validation_generator.reset()\n",
        "Y_pred = vgg_model.predict(validation_generator, steps=validation_generator.samples // validation_generator.batch_size + 1)\n",
        "y_pred = np.argmax(Y_pred, axis=1)\n",
        "\n",
        "# Get true labels\n",
        "y_true = validation_generator.classes\n",
        "\n",
        "# Calculate accuracy\n",
        "accuracy = accuracy_score(y_true, y_pred)\n",
        "\n",
        "# Calculate precision\n",
        "precision = precision_score(y_true, y_pred, average='weighted')\n",
        "\n",
        "# Calculate recall\n",
        "recall = recall_score(y_true, y_pred, average='weighted')\n",
        "\n",
        "# Calculate F1 score\n",
        "f1 = f1_score(y_true, y_pred, average='weighted')\n",
        "\n",
        "\n",
        "# Print calculated metrics\n",
        "print(f\"Accuracy: {accuracy}\")\n",
        "print(f\"Precision: {precision}\")\n",
        "print(f\"Recall: {recall}\")\n",
        "print(f\"F1 Score: {f1}\")\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "cSqst5Q0SWUr",
        "outputId": "c3d3a839-0dae-4481-908c-63194c796bf9"
      },
      "execution_count": 27,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 158ms/step\n",
            "Accuracy: 1.0\n",
            "Precision: 1.0\n",
            "Recall: 1.0\n",
            "F1 Score: 1.0\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "pMTYCGjCp148"
      },
      "execution_count": 27,
      "outputs": []
    }
  ],
  "metadata": {
    "colab": {
      "provenance": [],
      "gpuType": "T4",
      "include_colab_link": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 0
}